{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":7190488,"sourceType":"datasetVersion","datasetId":4157604}],"dockerImageVersionId":30616,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import matplotlib as mpl\nimport matplotlib.pyplot as plt\n%matplotlib inline\nimport numpy as np\nimport sklearn\nimport pandas as pd\nimport os\nimport sys\nimport time\nfrom tqdm.auto import tqdm\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\n\nprint(sys.version_info)\nfor module in mpl, np, pd, sklearn, torch:\n    print(module.__name__, module.__version__)\n    \ndevice = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\nprint(device)\n\nseed = 42\ntorch.manual_seed(seed)\ntorch.cuda.manual_seed_all(seed)\nnp.random.seed(seed)\n","metadata":{"execution":{"iopub.status.busy":"2023-12-13T09:26:45.199598Z","iopub.execute_input":"2023-12-13T09:26:45.199987Z","iopub.status.idle":"2023-12-13T09:26:48.843416Z","shell.execute_reply.started":"2023-12-13T09:26:45.199953Z","shell.execute_reply":"2023-12-13T09:26:48.842371Z"},"trusted":true},"execution_count":4,"outputs":[{"name":"stderr","text":"/opt/conda/lib/python3.10/site-packages/scipy/__init__.py:146: UserWarning: A NumPy version >=1.16.5 and <1.23.0 is required for this version of SciPy (detected version 1.24.3\n  warnings.warn(f\"A NumPy version >={np_minversion} and <{np_maxversion}\"\n","output_type":"stream"},{"name":"stdout","text":"sys.version_info(major=3, minor=10, micro=12, releaselevel='final', serial=0)\nmatplotlib 3.7.4\nnumpy 1.24.3\npandas 2.1.3\nsklearn 1.2.2\ntorch 2.0.0\ncuda:0\n","output_type":"stream"}]},{"cell_type":"markdown","source":"# 准备数据\n\n这里使用subword分词，我们使用已经清洗好的数据集，可以从[此处](https://www.kaggleusercontent.com/kf/98352223/eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0..nKt8lrIW5ej5QJQVpOWuqQ.oLIgiLMONU5Gpj_maVudRJa55NSOCILxk4JNZhvuXmeDBR-oG0uQm7bDHBfSwZRGvOBHQTsRV308iNP80btfwMinQ7yvJNt-GwdQF4XR4DIsg-2CbEPYiMsi_NdbL0FmE9LYStKdxCWbrCZCCMrTmo5LxR1txwibXaSpeP5Inobhbez5zetZIRH210CBuX2JbpRc_DULQpazKbtFPitwyfktVmdG_syvVAU6Sk9b0r0_erYAgb_jkKXX1Mxo1KzWSKLcAvbmMIPcsUkx9PmeJDs_wopfsQsZ1h5jaQX4_l0CTZrEenP6lIPDxpTwXANqqdHspmZeeEIAThqCHC6sb5DxTvG89BwzY9rc53Aa0uX4V806wJVybnRXoaV65K4GqpjnxbBK0WC8G-2lNtrqFujE89KDXZjFPgyfOEj1QIu13oFNSjgs6o4VV1PdZOrhiNdSmjb44c22l_unOaFojzJgzcPxq9AG2lcmrOpdZ2qu1jjdwey-58TA2ZHNCo3XnjEe2n3ignpnbsdLFpo22O8QakSUHv91wuYDYdNi3AiSmltL_k2ChuKfJ0G8kATpLe4k8wA26sO4GMXg4HImOr3b4aDVEIWXdApHP0ecFKs6ELTo8O7X-TK8Jvbua7e6qpDfDc-r_cD73fVSgSek5yNmKQMBzuVcjkprXmcxICQ.kV1b4N1s64NERKnt4zwQgQ/imdb_processed.csv)下载，分词使用 [subword-nmt](https://github.com/rsennrich/subword-nmt)","metadata":{}},{"cell_type":"code","source":"!ls ../input/imdb-processed","metadata":{"execution":{"iopub.status.busy":"2023-12-13T09:26:48.845459Z","iopub.execute_input":"2023-12-13T09:26:48.846270Z","iopub.status.idle":"2023-12-13T09:26:49.827837Z","shell.execute_reply.started":"2023-12-13T09:26:48.846233Z","shell.execute_reply":"2023-12-13T09:26:49.826750Z"},"trusted":true},"execution_count":5,"outputs":[{"name":"stdout","text":"imdb_processed.csv\n","output_type":"stream"}]},{"cell_type":"code","source":"cleaned_df = pd.read_csv(\"../input/imdb-processed/imdb_processed.csv\")\nprint(cleaned_df.shape) # (50000, 2), 50000条评论, 2列\n\n# 随机打乱数据，取训练集和测试集\nnp.random.seed(seed)\ncleaned_df = cleaned_df.sample(frac=1).reset_index(drop=True)\nwith open(\"imdb_train.txt\", \"w\", encoding=\"utf8\") as file:# 保存训练集\n    for line in cleaned_df.processed.values[:25000]:\n        file.write(line.lower() + \"\\n\")\n\nwith open(\"imdb_test.txt\", \"w\", encoding=\"utf8\") as file:# 保存测试集\n    for line in cleaned_df.processed.values[25000:]:\n        file.write(line.lower() + \"\\n\")","metadata":{"execution":{"iopub.status.busy":"2023-12-13T09:26:49.829392Z","iopub.execute_input":"2023-12-13T09:26:49.829726Z","iopub.status.idle":"2023-12-13T09:26:50.748578Z","shell.execute_reply.started":"2023-12-13T09:26:49.829696Z","shell.execute_reply":"2023-12-13T09:26:50.747627Z"},"trusted":true},"execution_count":6,"outputs":[{"name":"stdout","text":"(50000, 2)\n","output_type":"stream"}]},{"cell_type":"code","source":"!pip install subword-nmt","metadata":{"execution":{"iopub.status.busy":"2023-12-13T09:26:50.750808Z","iopub.execute_input":"2023-12-13T09:26:50.751105Z","iopub.status.idle":"2023-12-13T09:27:03.914206Z","shell.execute_reply.started":"2023-12-13T09:26:50.751080Z","shell.execute_reply":"2023-12-13T09:27:03.912935Z"},"trusted":true},"execution_count":7,"outputs":[{"name":"stdout","text":"Collecting subword-nmt\n  Downloading subword_nmt-0.3.8-py3-none-any.whl (27 kB)\nRequirement already satisfied: mock in /opt/conda/lib/python3.10/site-packages (from subword-nmt) (5.1.0)\nRequirement already satisfied: tqdm in /opt/conda/lib/python3.10/site-packages (from subword-nmt) (4.66.1)\nInstalling collected packages: subword-nmt\nSuccessfully installed subword-nmt-0.3.8\n","output_type":"stream"}]},{"cell_type":"code","source":"# 学习bpe分词(很慢,学一次就好)\n!subword-nmt learn-joint-bpe-and-vocab -i ./imdb_train.txt -o ./imdb_bpe_code --write-vocabulary ./imdb_bpe_vocab -s 8000\n# -i 选择学习的文件\n# -o 核心输出文件\n# --write-vocabulary 字典输出文件\n# -s 词表大小\n# 应用bpe分词\n!subword-nmt apply-bpe -c ./imdb_bpe_code -i ./imdb_train.txt -o ./imdb_train_bpe.txt\n!subword-nmt apply-bpe -c ./imdb_bpe_code -i ./imdb_test.txt -o ./imdb_test_bpe.txt","metadata":{"execution":{"iopub.status.busy":"2023-12-13T09:27:03.915652Z","iopub.execute_input":"2023-12-13T09:27:03.915985Z","iopub.status.idle":"2023-12-13T09:28:05.540565Z","shell.execute_reply.started":"2023-12-13T09:27:03.915955Z","shell.execute_reply":"2023-12-13T09:28:05.539047Z"},"trusted":true},"execution_count":8,"outputs":[{"name":"stdout","text":"100%|######################################| 8000/8000 [00:14<00:00, 554.11it/s]\n","output_type":"stream"}]},{"cell_type":"code","source":"# 分词后的数据长什么样\n!head ./imdb_train_bpe.txt\n# @@ 是分词的标记","metadata":{"execution":{"iopub.status.busy":"2023-12-13T09:28:05.546737Z","iopub.execute_input":"2023-12-13T09:28:05.547119Z","iopub.status.idle":"2023-12-13T09:28:06.541639Z","shell.execute_reply.started":"2023-12-13T09:28:05.547082Z","shell.execute_reply":"2023-12-13T09:28:06.540628Z"},"trusted":true},"execution_count":9,"outputs":[{"name":"stdout","text":"i really liked sum@@ mer@@ sla@@ m due look a@@ ren@@ a , cur@@ tain look overall interesting reason . anyways , could one best sum@@ mer@@ sla@@ m ever w@@ w@@ f le@@ x lu@@ ger main event yo@@ ko@@ z@@ un@@ a , time ok huge fat man v strong man i glad time changed . it terrible main event like every match lu@@ ger terrible . other match card ra@@ z@@ or ra@@ mon v ted di@@ bi@@ ase , ste@@ in@@ er brothers v hea@@ ven@@ ly bo@@ dies , sha@@ wn micha@@ els v cur@@ t h@@ ening , event sha@@ wn named big monster body guard die@@ sel , irs v - - kid , bre@@ t hart first take do@@ ink take jerry law@@ ler stuff har@@ ts law@@ ler always interesting , lu@@ d@@ vi@@ g bor@@ ga destroyed marty jan@@ ne@@ tty , under@@ taker took giant gon@@ z@@ ale@@ z another terrible match , the smoking g@@ unn@@ s tat@@ an@@ ka took ba@@ m ba@@ m bi@@ ge@@ low head@@ shr@@ in@@ kers , yo@@ ko@@ z@@ un@@ a def@@ ended world title le@@ x lu@@ ger match boring terrible ending . however deserves\nnot many television show appeal quite many different kind fan like far@@ scape . . . i know youn@@ g@@ ster year old fan male female many different country think ad@@ ore t . v miniseries . it element found almost every show t . v , character driven drama could australian soap opera yet episode science fact fiction would give even har@@ di@@ est tre@@ k@@ kie run money brain@@ ben@@ der sta@@ ke ! wor@@ m@@ hole theory , time travel true equ@@ a@@ tional form . . . magnificent . it embr@@ ace culture ma@@ p possibility endless multiple star therefore thousand planet choose . with broad scope would expected nothing would able keep illu@@ sion long , far@@ scape really come element . . . it succeeds others failed , especially like star trek universe practically zero ka@@ os element ! they ran idea pretty quickly kept re@@ ha@@ shing ! over course season manage keep audience attention using good continuity constant character evol@@ ution multiple thread every episode unique personal touch camera specific certain character group within whole . this structure allows extremely large area subject matter loy@@ alty for@@ ged broken many way many many issue . i happened see pilot premiere passing keep tun@@ ing see cri@@ ch@@ ton would ever get girl , seeing television i deli@@ ghted see available dvd i admit thing kept s@@ ane whilst i hour night shift developed chron@@ ic in@@ som@@ nia . . . far@@ scape thing get extremely long night . . . do fav@@ our watch pilot see i mean . . . far@@ scape com@@ et\nthe film quickly get major chase scene ever increa@@ sing destruction . the first really bad thing guy hi@@ jac@@ king steven seagal would beaten pulp seagal driving , probably would ended whole premise movie . it seems like decided make kind change movie plot , plan enjoy action , expect coherent plot . turn sense logic may , re@@ duce chance getting head@@ ache . i give hope steven seagal trying move back towards type character portrayed popular movie .\njane austen would definitely appro@@ ve one ! g@@ wy@@ ne@@ th pal@@ tro@@ w awesome job capturing attitude emma . she funny without exce@@ ssively silly , yet eleg@@ ant . she put convincing british accent british , maybe i best judge , fooled . . . also excellent sli@@ ding do@@ ors . . . i sometimes forget american ! . also brilliant jeremy north@@ am sophi@@ e th@@ omp@@ son ph@@ y@@ lli@@ da law emma th@@ omp@@ son sister mother bates woman . they nearly steal show . . . ms . law even line ! highly recommended .\nexpec@@ ta@@ tions somewhat high i went see movie , i thought steve care@@ ll could wrong coming great movie like an@@ chor@@ man , the year - old virgin , little miss sun@@ shine . boy , i wrong . i start right movie certain point steve care@@ ll allowed steve care@@ ll . there handful moment film made laugh , due almost entirely given wi@@ ggle - room thing . he undoubtedly talented individual , shame sig@@ ned turned , opinion , total train - wreck . with way , i discus went horri@@ f@@ y@@ ingly wrong . the film begin dan burns , wi@@ do@@ wer three girl considered na@@ tionally syn@@ di@@ cated advice colum@@ n . he pre@@ pa@@ res girl family reunion , extended relative ga@@ ther time . the family high at@@ op list thing make awful movie . no family beha@@ ves like . it almost tran@@ spor@@ ted pleasan@@ t@@ ville leave bea@@ ver . they caricature think family . it reach point become obnoxious simply frustrating . touch football , cro@@ ss@@ word puzzle competition , family bow@@ ling , talent show are not how actual people behave . it almost sick@@ ening . another big flaw woman care@@ ll supposed falling . obser@@ ving first scene steve care@@ ll like watching stro@@ ke victim trying re@@ hab@@ il@@ it@@ ated . what i imagine supposed unique original woman come mildly retarded . it make think movie taking place another planet . i left theater wondering i saw . after thinking , i think much .\ni watched movie fairly regular basis life , never get old . for sni@@ de remark insult mostly david spa@@ de , tommy boy giant heart . and keep movie funny year . tommy cal@@ la@@ han chris far@@ ley son big tom cal@@ la@@ han brian den@@ ne@@ h@@ y , master car part sal@@ es@@ man , ri@@ dden life . but died dy wedding day , tommy learns company deb@@ t , bought ray z@@ al@@ in@@ sky dan ak@@ roy@@ d , owner huge car part company . so order save company , tommy go road sell company new bra@@ ke pa@@ d . along ride , though choice , richard hay@@ den david spa@@ de former cla@@ ss@@ mate tommy big tom right - hand man . the movie ride chemistry two sn@@ l star real - life best friend chris far@@ ley david spa@@ de . the duo enough comic energy going power world . it big , dumb guy versus smart little guy . it work , scene un@@ forget@@ tably funny . far@@ ley spa@@ de actually decent dramatic actor well . although film primarily comedy , fair share drama , spa@@ de especially far@@ ley good making audience laugh . forgive , i talk chris far@@ ley little . i read biography the chris far@@ ley show a biography three acts , anyone care , understanding chris real life made movie special . chris far@@ ley genuinely good person strugg@@ led , ultimately failed con@@ qu@@ er addic@@ tion . although first movie major role , best film . it really showed , much talent . knowing chris story add another layer movie , although make le funny . far@@ ley spa@@ de matched good screen cast . rob lo@@ we suit@@ ably sli@@ my tommy new brother , bo derek solid step - mother . brian den@@ ne@@ h@@ y great big tom . den@@ ne@@ h@@ y make easy believe father son . big tom crazy son , although smar@@ ter mature . dan ak@@ roy@@ d give one best performance z@@ al@@ in@@ sky , giving tommy hard truth behind advertising . julie warner also good tommy love interest , michelle . for , peter se@@ gal one great comedy director . he keep pace quick ener@@ ge@@ tic , importantly , know make comedy funny . he be@@ la@@ bor joke , understand@@ s funny actor know allows . but se@@ gal go step . he give tommy boy friendly , almost nostal@@ gic tone tu@@ g heart@@ str@@ ings genuinely ti@@ ckle f@@ unn@@ y@@ bone . cri@@ tics like tommy boy . shame . a movie super sophisticated sub@@ ver@@ sively intellectual funny god for@@ bid far@@ ley spa@@ de forced mu@@ ted comedy la the office . this great movie one - time favorite .\nfor story hope high@@ ligh@@ ted tragic reality youth face . fav@@ ela rising draw one scary , un@@ safe un@@ fair world show beautiful color moving music one man dedicated friend choose accept world change action art . an entertaining , interesting , emotional , aes@@ the@@ tically beautiful film . i showed film numerous high school student well live neighborhood poverty gun violence en@@ amo@@ red anderson , protagonist . i recommend film age due subtitle image death background .\nokay , i get pur@@ gatory thing first time i watched episode . it seemed like something significant going i put finger . this time co@@ sta me@@ sa fire tv really caught attention - helped i writing ess@@ ay inf@@ er@@ no ! but let see ha@@ s@@ n t discu@@ ssed yet . . . a tw@@ op review mentioned tony flight sta@@ ir go broken elev@@ ator . yeah , significant number lot reason , especially religious , one ya . on hun@@ ch i con@@ sulted wi@@ ki@@ pe@@ dia , guess dan@@ te divi@@ ded level ? pur@@ g@@ at@@ ori@@ o . exclu@@ ding ante - pur@@ gatory para@@ di@@ se . the stuff bottom sta@@ ir . . . tony get . on alle@@ ge@@ dly random mon@@ k - slap scene . as soon mon@@ k appeared , fit perfectly place tony trying get pur@@ gatory . you tell got worried christian commercial death , disease , sin came , getting desperate christian heaven looking kinda i@@ ffy . by time meet mon@@ k thinking hey maybe guy help ? sound like contem@@ pla@@ ting religion e . g . bud@@ d@@ h@@ ism wondering path could take sal@@ vation . not tony necessarily literally thinking becoming bud@@ d@@ hi@@ st , appears fin@@ ner@@ ty tried me@@ ssed . that slap face basically tell tony quick fix - , , suddenly embr@@ ace bud@@ d@@ h@@ ism get . tony initially concerned getting heaven . but con@@ ference en@@ tr@@ ance , realizes going easy . at first i saw name v . driver li@@ cen@@ se problem tony led sort double life , killing people sleeping around kept secret people . he feel free affair qu@@ as@@ i - mel@@ fi kevin fin@@ ner@@ ty . he figure can fool people k@@ f card , like hotel rec@@ ep@@ tion@@ ist , get pur@@ gatory . those helicopter - helicopter heaven ? - keeping track everything . after reading theory in@@ fin@@ ner@@ ty , though , seems like k@@ f identity remin@@ der in@@ fin@@ ite different path tony could taken life . possibly along car joke involving in@@ fin@@ it@@ i made sense otherwise . a@@ a@@ and point brain fi@@ zz@@ le .\ni disappointed series . it lot cool graphic . the level detail went minimal , i always got feeling audience pat@@ ron@@ ized - - lot seemed this extremely cool going explain detail get anyway . let show pretty picture entertain . the host would drop interesting - sounding word spar@@ tic@@ les super - sym@@ me@@ try without attempt explaining . we look wi@@ ki@@ pe@@ dia . furthermore , i know quite bit super@@ string la@@ y@@ man i found explanation convoluted could much better . they could chosen much better example explain concept , instead , example used confusing ob@@ scu@@ red subject . ad@@ di@@ tionally , i got sick repeti@@ ti@@ veness . they could easily con@@ den@@ sed series one episode cut repeti@@ tion . they must shown clip qu@@ an@@ tum ca@@ f time . the host kept saying thing . i remember many time said the universe made tiny little vi@@ bra@@ ting string . it like trying brain@@ wa@@ sh u accep@@ ting super@@ string best thing since sli@@ ced b@@ read . finally , show ended unpleasant sense competition fer@@ mil@@ a@@ b cer@@ n , clearly bi@@ ased towards fer@@ mil@@ a@@ b . this supposed edu@@ cational program qu@@ an@@ tum physi@@ c , whether us better europe vice ver@@ sa ! i also felt part pat@@ ron@@ i@@ zing - - audi@@ en@@ ces need see conflict remain interested . please . give little credit . overall , thumb -\nthe first minute tin@@ sel@@ town finger te@@ e@@ tering remote , po@@ ised flick around watch something else . the premise two writer , luck , living self - stor@@ age - space bin mildly amusing , , painfully bland . the introduction character , played joe pan@@ to@@ li@@ ano - big deal movie guy , life park sleep la@@ v@@ atory , offered hope i decided give minute . and kri@@ sty s@@ wan@@ sons introduction bud@@ ding film director bor@@ der@@ line ny@@ mp@@ hom@@ ani@@ ac , added bit sp@@ ice . her solid acting performance raised presence beyond welcome eye - candy inclu@@ sion . ultimately , obvious low - budget impact film poorly shot scene , stu@@ t@@ tured pace slapstick hand@@ ling certain moment . some favourite movie time low budget , whi@@ th@@ nail i one also deal guy dream , luck . however , money , actor save tin@@ sel@@ town terrible movie archi@@ ve nu@@ dge could cult movie archi@@ ve . i laughed loud scene involving joe pan@@ to@@ li@@ ano character . in particular , pen@@ ultimate scene terribly clichd , still funny , rich - - scre@@ wed - character house , story un@@ ra@@ vel@@ s towards final moment . i see tin@@ sel@@ town great stage play film - maker best transla@@ te celluloid , simply work i laughed loud scene one liner , i think first minute du@@ lled sen@@ s expectation degree i would laughed anything . unless stuck no@@ vel@@ ty coffee coa@@ ster , pick see bar@@ gain bu@@ cket .\n","output_type":"stream"}]},{"cell_type":"code","source":"subwords = []\nwith open(\"imdb_train_bpe.txt\", \"r\", encoding=\"utf8\") as file:\n    for line in file.readlines():\n        subwords.append(line.strip())\n        \nwith open(\"imdb_test_bpe.txt\", \"r\", encoding=\"utf8\") as file:\n    for line in file.readlines():\n        subwords.append(line.strip())\n        \ncleaned_df[\"subwords10k\"] = subwords\ncleaned_df[\"split\"] = [\"train\"] * 25000 + [\"test\"] * 25000\ncleaned_df.to_csv(\"imdb_subwords.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2023-12-13T09:28:06.543372Z","iopub.execute_input":"2023-12-13T09:28:06.544271Z","iopub.status.idle":"2023-12-13T09:28:10.767254Z","shell.execute_reply.started":"2023-12-13T09:28:06.544229Z","shell.execute_reply":"2023-12-13T09:28:10.766248Z"},"trusted":true},"execution_count":10,"outputs":[]},{"cell_type":"code","source":"from torch.utils.data import Dataset, DataLoader\n\n# 随后加载数据集就从bpe分词的文件里加载\nclass IMDBDataset(Dataset):\n    def __init__(self, mode=\"train\"):\n        df = pd.read_csv(\"imdb_subwords.csv\").query(\"split == '{}'\".format(mode))\n        self.texts = df[\"subwords10k\"].values\n        self.labels = df[\"label\"].values\n    \n    def __len__(self):\n        return len(self.labels)\n    \n    def __getitem__(self, idx):\n        return self.texts[idx].split(), self.labels[idx]\n    \n    \ntrain_ds = IMDBDataset(\"train\")\ntest_ds = IMDBDataset(\"test\")","metadata":{"execution":{"iopub.status.busy":"2023-12-13T09:28:10.768620Z","iopub.execute_input":"2023-12-13T09:28:10.768920Z","iopub.status.idle":"2023-12-13T09:28:12.431270Z","shell.execute_reply.started":"2023-12-13T09:28:10.768894Z","shell.execute_reply":"2023-12-13T09:28:12.430395Z"},"trusted":true},"execution_count":11,"outputs":[]},{"cell_type":"markdown","source":"## 构造 word2idx 和 idx2word","metadata":{}},{"cell_type":"code","source":"#载入词表，看下词表长度，词表就像英语字典\nword2idx = {\n    \"[PAD]\": 0,     # 填充 token\n    \"[BOS]\": 1,     # begin of sentence\n    \"[UNK]\": 2,     # 未知 token\n    \"[EOS]\": 3,     # end of sentence\n}\nidx2word = {value: key for key, value in word2idx.items()}\nindex = len(idx2word)\nthreshold = 1  # 出现次数低于此的token舍弃\n\nwith open(\"imdb_bpe_vocab\", \"r\", encoding=\"utf8\") as file:\n    for line in tqdm(file.readlines()):\n        token, counts = line.strip().split()\n        if int(counts) >= threshold:\n            word2idx[token] = index\n            idx2word[index] = token\n            index += 1\n            \nvocab_size = len(word2idx)\nprint(\"vocab_size: {}\".format(vocab_size))","metadata":{"execution":{"iopub.status.busy":"2023-12-13T09:28:12.432427Z","iopub.execute_input":"2023-12-13T09:28:12.432703Z","iopub.status.idle":"2023-12-13T09:28:12.475013Z","shell.execute_reply.started":"2023-12-13T09:28:12.432678Z","shell.execute_reply":"2023-12-13T09:28:12.474135Z"},"trusted":true},"execution_count":12,"outputs":[{"output_type":"display_data","data":{"text/plain":"  0%|          | 0/8031 [00:00<?, ?it/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"ea309cb5fae34a15af11309d4907166d"}},"metadata":{}},{"name":"stdout","text":"vocab_size: 8035\n","output_type":"stream"}]},{"cell_type":"code","source":"# 选择 max_length\nlength_collect = {}\nfor text, label in train_ds:\n    length = len(text)\n    length_collect[length] = length_collect.get(length, 0) + 1\n    \nMAX_LENGTH = 500\nplt.bar(length_collect.keys(), length_collect.values())\nplt.axvline(MAX_LENGTH, label=\"max length\", c=\"gray\", ls=\":\")\nplt.legend()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-12-13T09:28:12.478235Z","iopub.execute_input":"2023-12-13T09:28:12.478544Z","iopub.status.idle":"2023-12-13T09:28:14.954462Z","shell.execute_reply.started":"2023-12-13T09:28:12.478518Z","shell.execute_reply":"2023-12-13T09:28:14.953542Z"},"trusted":true},"execution_count":13,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAAAigAAAGdCAYAAAA44ojeAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8WgzjOAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA2yElEQVR4nO3deXxU1f3/8fdsCYlmMUC2SggCsiiLRg1xQVpSA+KCoBWlCErBBaxKpYi/Kmi/3y9ULdRaRFsVqCK4VKHF7cGOSwChoOCCQKNgSQKFJgGRZJbz+6Pf3K8jCZPAhLnJfT0fj3lw5t4zdz6Hm9x85pxzz7iMMUYAAAA24o51AAAAAN9HggIAAGyHBAUAANgOCQoAALAdEhQAAGA7JCgAAMB2SFAAAIDtkKAAAADb8cY6gOMRCoW0Z88eJSUlyeVyxTocAADQAMYYHTx4UNnZ2XK7j91H0iwTlD179qhdu3axDgMAAByH3bt36/TTTz9mnWaZoCQlJUn6TwOTk5NjHA0AAGiIqqoqtWvXzvo7fizNMkGpHdZJTk4mQUGjBINBrV27VpLUp08feTyeGEcEAM7TkOkZzTJBAY5XMBjUsmXLJEnnn38+CQoA2BQJChzF7XarV69eVhkAYE8kKHAUr9erwYMHxzoMAEAEJCgAgKgzxigQCCgYDMY6FJxEHo9HXq83KkuAkKAAAKKqpqZGpaWlOnz4cKxDQQwkJiYqKytLcXFxJ3QcEhQ4Sk1NjWbMmCFJmjBhwgn/AgEIFwqFVFJSIo/Ho+zsbMXFxbGgpkMYY1RTU6N9+/appKREnTt3PqG5fiQocJzq6upYhwC0WDU1NQqFQmrXrp0SExNjHQ5OsoSEBPl8Pn311VeqqalRq1atjvtYJChwFJ/Pp/Hjx1tlAE2Du+ScK1rnngQFjuJyudS6detYhwEAiIAUFwAAm3G5XFq0aFGsw5AkTZ06Vb179z7p70uCAkcJBoNav3691q9fz+2PAPA9dkqMGOKBowSDQb311luSpN69e7PUPQDYFD0ocBS3263u3bure/fuTOIDEKZfv3668847dffdd+u0005TRkaG/vSnP+mbb77RzTffrKSkJHXq1Mn6kCP950PP6NGj1aFDByUkJKhLly56/PHHrf1HjhzRWWedpbFjx1rbdu7cqaSkJD333HMNjm337t36yU9+otTUVKWlpenqq6/Wl19+ae0fNWqUBg8erMcee0xZWVlq3bq1xo0bJ7/fb9UpLS3VoEGDlJCQoA4dOujFF19Ubm6ufve730mScnNzJUnXXHONXC6X9bzW888/r9zcXKWkpGjYsGE6ePBgg+M/Hlyh4Sher1fXXXedrrvuOnm9dCACJ1NNTY1qampkjLG2BYNB1dTUKBAIRLXu8Zo3b57atGmj9evX684779Ttt9+u6667ThdeeKH+/ve/67LLLtOIESOsRehCoZBOP/10vfLKK/r000/14IMP6v7779fLL78sSWrVqpXmz5+vefPmafHixQoGg/rpT3+qH//4x7rlllsaFJPf71dRUZGSkpL07rvv6v3339epp56qAQMGqKamxqq3cuVK7dy5UytXrtS8efM0d+5czZ0719p/0003ac+ePVq1apX+8pe/6I9//KP27t1r7f/www8lSXPmzFFpaan1XPpPUrVo0SItWbJES5Ys0erVqzV9+vTj/n9uENMMVVZWGkmmsrIy1qEAAL7j22+/NZ9++qn59ttvj9o3depUM3XqVHPo0CFr2+rVq83UqVPN4sWLw+r+93//t5k6dar597//bW0rLi42U6dONX/5y1/C6j7yyCNm6tSppry8/IRiv/TSS83FF19sPQ8EAuaUU04xI0aMsLaVlpYaSaa4uLje44wbN84MHTr0qBjbtGljxo8fb7Kyssy//vWvY8Yiybz++uvGGGOef/5506VLFxMKhaz91dXVJiEhwbzzzjvGGGNGjhxp2rdvbwKBgFXnuuuuM9dff70xxpjPPvvMSDIffvihtX/79u1Gkpk5c2ad71trypQpJjEx0VRVVVnbJk6caPLz8+uM/Vg/A435+81HSAAA/lfPnj2tssfjUevWrdWjRw9rW0ZGhiSF9TzMmjVLzz33nHbt2qVvv/1WNTU1R9318otf/EKLFi3SH/7wB7311luNWu7go48+0o4dO5SUlBS2/ciRI9q5c6f1/KyzzgqbV5eVlaUtW7ZIkrZt2yav16tzzz3X2t+pUyeddtppDYohNzc37P2zsrLC/g+aAgkKHMXv9+uJJ56QJN15550s1gacRJMnT5YUvkjiRRddpD59+hw1J+zee+89qu7555+vc88996i6d91111F1j9f3j+FyucK21S7bHwqFJEkLFy7Uvffeq9/+9rcqKChQUlKSHn30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zOuvvx62f/r06SYlJcUsWrTIfPTRR+aqq64yHTp0MN9++61VZ8CAAaZXr15m7dq15t133zWdOnUyN9xwg7W/srLSZGRkmOHDh5utW7eaBQsWmISEBPP000+frGYe5VjtrqioMIWFheall14yn3/+uSkuLjYXXHCBycvLCztG+/btzcMPPxz2M/Dda4Hd2h3pXI8cOdIMGDAgrD0HDhwIq9PSzrUxJqy9paWl5rnnnjMul8vs3LnTqtPcznUkJCjGmAsuuMCMGzfOeh4MBk12draZNm1aDKOKnr179xpJZvXq1da2Sy+91Nx11131vubNN980brfblJWVWdtmz55tkpOTTXV1dVOGe1ymTJlievXqVee+iooK4/P5zCuvvGJt++yzz4wkU1xcbIxpfu2tz1133WU6duxoQqGQMablnWdjzFEX71AoZDIzM82jjz5qbauoqDDx8fFmwYIFxhhjPv30UyPJfPjhh1adt956y7hcLvPPf/7TGGPMk08+aU477bSwdk+aNMl06dKliVvUMHX90fq+9evXG0nmq6++sra1b9/ezJw5s97X2Lnd9SUoV199db2vccq5vvrqq82PfvSjsG3N+VzXxfFDPDU1Ndq4caMKCwutbW63W4WFhSouLo5hZNFTWVkpSUpLSwvbPn/+fLVp00Znn322Jk+erMOHD1v7iouL1aNHj7CF84qKilRVVaVPPvnk5ATeSNu3b1d2drbOOOMMDR8+XLt27ZIkbdy4UX6/P+wcd+3aVTk5OdY5bo7t/b6amhq98MILuuWWW8K+RLOlnefvKykpUVlZWdj5TUlJUX5+ftj5TU1N1XnnnWfVKSwslNvt1rp166w6ffv2VVxcnFWnqKhI27Zt07///e+T1JoTU1lZKZfLddR3lU2fPl2tW7fWOeeco0cffTRsCK85tnvVqlVKT09Xly5ddPvtt2v//v3WPiec6/Lycr3xxhsaPXr0Ufta0rluFt9m3JT+9a9/KRgMHrWCbUZGhj7//PMYRRU9oVBId999ty666CKdffbZ1vYbb7xR7du3V3Z2tj7++GNNmjRJ27Zt02uvvSZJKisrq/P/pHaf3eTn52vu3Lnq0qWLSktL9dBDD+mSSy7R1q1bVVZWpri4uKMu2hkZGVZbmlt767Jo0SJVVFRo1KhR1raWdp7rUhtnXe347vlNT08P2+/1epWWlhZWp0OHDkcdo3bfaaed1iTxR8uRI0c0adIk3XDDDWFfGPfzn/9c5557rtLS0vTBBx9o8uTJKi0t1YwZMyQ1v3YPGDBAQ4YMUYcOHbRz507df//9GjhwoIqLi+XxeBxxrufNm6ekpCQNGTIkbHtLO9eOT1BaunHjxmnr1q167733wraPHTvWKvfo0UNZWVnq37+/du7cqY4dO57sME/YwIEDrXLPnj2Vn5+v9u3b6+WXX1ZCQkIMIzt5nn32WQ0cODDsa8xb2nlG3fx+v37yk5/IGKPZs2eH7ZswYYJV7tmzp+Li4nTrrbdq2rRpzXJp9GHDhlnlHj16qGfPnurYsaNWrVql/v37xzCyk+e5557T8OHD1apVq7DtLe1cO36Ip02bNvJ4PEfd0VFeXq7MzMwYRRUd48eP15IlS7Ry5Uqdfvrpx6ybn58vSdqxY4ckKTMzs87/k9p9dpeamqozzzxTO3bsUGZmpmpqalRRURFW57vnuLm396uvvtKyZcv0s5/97Jj1Wtp5lv4vzmP9DmdmZmrv3r1h+wOBgA4cONDsfwZqk5OvvvpKS5cuDes9qUt+fr4CgYC+/PJLSc233bXOOOMMtWnTJuxnuqWea0l69913tW3btoi/61LzP9eOT1Di4uKUl5en5cuXW9tCoZCWL1+ugoKCGEZ2/IwxGj9+vF5//XWtWLHiqC69umzevFmSlJWVJUkqKCjQli1bwn7Ray9+3bt3b5K4o+nQoUPauXOnsrKylJeXJ5/PF3aOt23bpl27dlnnuLm3d86cOUpPT9egQYOOWa+lnWdJ6tChgzIzM8POb1VVldatWxd2fisqKrRx40arzooVKxQKhaykraCgQGvWrJHf77fqLF26VF26dLFd13et2uRk+/btWrZsmVq3bh3xNZs3b5bb7baGQZpju7/r66+/1v79+8N+plviua717LPPKi8vT7169YpYt9mf61jP0rWDhQsXmvj4eDN37lzz6aefmrFjx5rU1NSwOxuak9tvv92kpKSYVatWhd1udvjwYWOMMTt27DAPP/yw2bBhgykpKTGLFy82Z5xxhunbt691jNrbTy+77DKzefNm8/bbb5u2bdva7vbTWr/4xS/MqlWrTElJiXn//fdNYWGhadOmjdm7d68x5j+3Gefk5JgVK1aYDRs2mIKCAlNQUGC9vrm197uCwaDJyckxkyZNCtveks7zwYMHzaZNm8ymTZuMJDNjxgyzadMm626V6dOnm9TUVLN48WLz8ccfm6uvvrrO24zPOeccs27dOvPee++Zzp07h916WlFRYTIyMsyIESPM1q1bzcKFC01iYmJMb8E8VrtramrMVVddZU4//XSzefPmsN/12rs0PvjgAzNz5kyzefNms3PnTvPCCy+Ytm3bmptuusl6D7u1+1htPnjwoLn33ntNcXGxKSkpMcuWLTPnnnuu6dy5szly5Ih1jJZ2rmtVVlaaxMREM3v27KNe3xzPdSQkKP/riSeeMDk5OSYuLs5ccMEFZu3atbEO6bhJqvMxZ84cY4wxu3btMn379jVpaWkmPj7edOrUyUycODFsfQxjjPnyyy/NwIEDTUJCgmnTpo35xS9+Yfx+fwxaFNn1119vsrKyTFxcnPnBD35grr/+erNjxw5r/7fffmvuuOMOc9ppp5nExERzzTXXmNLS0rBjNKf2ftc777xjJJlt27aFbW9J53nlypV1/kyPHDnSGPOfW40feOABk5GRYeLj403//v2P+v/Yv3+/ueGGG8ypp55qkpOTzc0332wOHjwYVuejjz4yF198sYmPjzc/+MEPzPTp009WE+t0rHaXlJTU+7teuw7Oxo0bTX5+vklJSTGtWrUy3bp1M//zP/8T9sfcGHu1+1htPnz4sLnssstM27Ztjc/nM+3btzdjxow56sNkSzvXtZ5++mmTkJBgKioqjnp9czzXkbiMMaZJu2gAAAAayfFzUAAAgP2QoAAAANshQQEAALZDggIAAGyHBAUAANgOCQoAALAdEhQAAGA7JCgAAMB2SFAAAIDtkKAAAADbIUEBAAC2Q4ICAABs5/8Daygyx0emXi8AAAAASUVORK5CYII="},"metadata":{}}]},{"cell_type":"markdown","source":"## Tokenizer","metadata":{}},{"cell_type":"code","source":"class Tokenizer:\n    def __init__(self, word2idx, idx2word, max_length=500, pad_idx=0, bos_idx=1, eos_idx=3, unk_idx=2):\n        self.word2idx = word2idx\n        self.idx2word = idx2word\n        self.max_length = max_length\n        self.pad_idx = pad_idx\n        self.bos_idx = bos_idx\n        self.eos_idx = eos_idx\n        self.unk_idx = unk_idx\n    \n    def encode(self, text_list, padding_first=False):\n        \"\"\"如果padding_first == True，则padding加载前面，否则加载后面\"\"\"\n        max_length = min(self.max_length, 2 + max([len(text) for text in text_list]))\n        indices_list = []\n        for text in text_list:\n            indices = [self.bos_idx] + [self.word2idx.get(word, self.unk_idx) for word in text[:max_length-2]] + [self.eos_idx]\n            if padding_first:\n                indices = [self.pad_idx] * (max_length - len(indices)) + indices\n            else:\n                indices = indices + [self.pad_idx] * (max_length - len(indices))\n            indices_list.append(indices)\n        return torch.tensor(indices_list)\n    \n    \n    def decode(self, indices_list, remove_bos=True, remove_eos=True, remove_pad=True, split=False):\n        text_list = []\n        for indices in indices_list:\n            text = []\n            for index in indices:\n                word = self.idx2word.get(index, \"[UNK]\")\n                if remove_bos and word == \"[BOS]\":\n                    continue\n                if remove_eos and word == \"[EOS]\":\n                    break\n                if remove_pad and word == \"[PAD]\":\n                    break\n                text.append(word)\n            text_list.append(\" \".join(text) if not split else text)\n        return text_list\n    \n\ntokenizer = Tokenizer(word2idx=word2idx, idx2word=idx2word)\nraw_text = [\"hello world\".split(), \"tokenize text datas with batch\".split(), \"this is a test\".split()]\nindices = tokenizer.encode(raw_text, padding_first=True)\ndecode_text = tokenizer.decode(indices.tolist(), remove_bos=False, remove_eos=False, remove_pad=False)\nprint(\"raw text\")\nfor raw in raw_text:\n    print(raw)\nprint(\"indices\")\nfor index in indices:\n    print(index)\nprint(\"decode text\")\nfor decode in decode_text:\n    print(decode)","metadata":{"execution":{"iopub.status.busy":"2023-12-13T09:28:14.955737Z","iopub.execute_input":"2023-12-13T09:28:14.956089Z","iopub.status.idle":"2023-12-13T09:28:15.001567Z","shell.execute_reply.started":"2023-12-13T09:28:14.956053Z","shell.execute_reply":"2023-12-13T09:28:15.000645Z"},"trusted":true},"execution_count":14,"outputs":[{"name":"stdout","text":"raw text\n['hello', 'world']\n['tokenize', 'text', 'datas', 'with', 'batch']\n['this', 'is', 'a', 'test']\nindices\ntensor([   0,    0,    0,    1, 6513,  125,    3])\ntensor([   1,    2, 3232,    2,  686,    2,    3])\ntensor([   0,    1,   18,  395,   26, 1892,    3])\ndecode text\n[PAD] [PAD] [PAD] [BOS] hello world [EOS]\n[BOS] [UNK] text [UNK] with [UNK] [EOS]\n[PAD] [BOS] this is a test [EOS]\n","output_type":"stream"}]},{"cell_type":"code","source":"def collate_fct(batch):\n    text_list = [item[0] for item in batch]\n    label_list = [item[1] for item in batch]\n    # 这里使用 padding first\n    text_list = tokenizer.encode(text_list, padding_first=True).to(dtype=torch.int)\n    return text_list, torch.tensor(label_list).reshape(-1, 1).to(dtype=torch.float)\n\nbatch_size = 128\ntrain_dl = DataLoader(train_ds, batch_size=batch_size, shuffle=True, collate_fn=collate_fct)\ntest_dl = DataLoader(test_ds, batch_size=batch_size, shuffle=False, collate_fn=collate_fct)","metadata":{"execution":{"iopub.status.busy":"2023-12-13T09:28:15.002827Z","iopub.execute_input":"2023-12-13T09:28:15.003178Z","iopub.status.idle":"2023-12-13T09:28:15.010110Z","shell.execute_reply.started":"2023-12-13T09:28:15.003145Z","shell.execute_reply":"2023-12-13T09:28:15.009129Z"},"trusted":true},"execution_count":15,"outputs":[]},{"cell_type":"markdown","source":"# 定义模型","metadata":{}},{"cell_type":"code","source":"class LSTM(nn.Module):\n    def __init__(self, embedding_dim=16, hidden_dim=64, vocab_size=vocab_size, num_layers=1, bidirectional=False):\n        super(LSTM, self).__init__()\n        self.embeding = nn.Embedding(vocab_size, embedding_dim)\n        self.lstm = nn.LSTM(embedding_dim, hidden_dim, num_layers=num_layers, batch_first=True, bidirectional=bidirectional)\n        self.layer = nn.Linear(hidden_dim * (2 if bidirectional else 1), hidden_dim)\n        self.fc = nn.Linear(hidden_dim, 1)\n        \n    def forward(self, x):\n        # [bs, seq length]\n        x = self.embeding(x)\n        # [bs, seq length, embedding_dim] -> shape [bs, embedding_dim, seq length]\n        seq_output, (hidden, cell) = self.lstm(x)\n        # [bs, seq length, hidden_dim], [*, bs, hidden_dim]\n        x = seq_output[:, -1, :]\n        # 取最后一个时间步的输出 (这也是为什么要设置padding_first=True的原因)\n        x = self.layer(x)\n        x = self.fc(x)\n        return x\n    \nsample_inputs = torch.randint(0, vocab_size, (2, 128))\n    \nprint(\"{:=^80}\".format(\" 一层单向 LSTM \"))       \nfor key, value in LSTM().named_parameters():\n    print(f\"{key:^40}paramerters num: {np.prod(value.shape)}\")\n\n    \nprint(\"{:=^80}\".format(\" 一层双向 LSTM \"))       \nfor key, value in LSTM(bidirectional=True).named_parameters():\n    print(f\"{key:^40}paramerters num: {np.prod(value.shape)}\")\n\n    \nprint(\"{:=^80}\".format(\" 两层单向 LSTM \"))       \nfor key, value in LSTM(num_layers=2).named_parameters():\n    print(f\"{key:^40}paramerters num: {np.prod(value.shape)}\")\n","metadata":{"execution":{"iopub.status.busy":"2023-12-13T09:28:15.011516Z","iopub.execute_input":"2023-12-13T09:28:15.011871Z","iopub.status.idle":"2023-12-13T09:28:15.042968Z","shell.execute_reply.started":"2023-12-13T09:28:15.011840Z","shell.execute_reply":"2023-12-13T09:28:15.041932Z"},"trusted":true},"execution_count":16,"outputs":[{"name":"stdout","text":"================================== 一层单向 LSTM ===================================\n            embeding.weight             paramerters num: 128560\n           lstm.weight_ih_l0            paramerters num: 4096\n           lstm.weight_hh_l0            paramerters num: 16384\n            lstm.bias_ih_l0             paramerters num: 256\n            lstm.bias_hh_l0             paramerters num: 256\n              layer.weight              paramerters num: 4096\n               layer.bias               paramerters num: 64\n               fc.weight                paramerters num: 64\n                fc.bias                 paramerters num: 1\n================================== 一层双向 LSTM ===================================\n            embeding.weight             paramerters num: 128560\n           lstm.weight_ih_l0            paramerters num: 4096\n           lstm.weight_hh_l0            paramerters num: 16384\n            lstm.bias_ih_l0             paramerters num: 256\n            lstm.bias_hh_l0             paramerters num: 256\n       lstm.weight_ih_l0_reverse        paramerters num: 4096\n       lstm.weight_hh_l0_reverse        paramerters num: 16384\n        lstm.bias_ih_l0_reverse         paramerters num: 256\n        lstm.bias_hh_l0_reverse         paramerters num: 256\n              layer.weight              paramerters num: 8192\n               layer.bias               paramerters num: 64\n               fc.weight                paramerters num: 64\n                fc.bias                 paramerters num: 1\n================================== 两层单向 LSTM ===================================\n            embeding.weight             paramerters num: 128560\n           lstm.weight_ih_l0            paramerters num: 4096\n           lstm.weight_hh_l0            paramerters num: 16384\n            lstm.bias_ih_l0             paramerters num: 256\n            lstm.bias_hh_l0             paramerters num: 256\n           lstm.weight_ih_l1            paramerters num: 16384\n           lstm.weight_hh_l1            paramerters num: 16384\n            lstm.bias_ih_l1             paramerters num: 256\n            lstm.bias_hh_l1             paramerters num: 256\n              layer.weight              paramerters num: 4096\n               layer.bias               paramerters num: 64\n               fc.weight                paramerters num: 64\n                fc.bias                 paramerters num: 1\n","output_type":"stream"}]},{"cell_type":"markdown","source":"# 训练","metadata":{}},{"cell_type":"code","source":"from sklearn.metrics import accuracy_score\n\n@torch.no_grad()\ndef evaluating(model, dataloader, loss_fct):\n    loss_list = []\n    pred_list = []\n    label_list = []\n    for datas, labels in dataloader:\n        datas = datas.to(device)\n        labels = labels.to(device)\n        # 前向计算\n        logits = model(datas)\n        loss = loss_fct(logits, labels)         # 验证集损失\n        loss_list.append(loss.item())\n        # 二分类\n        preds = logits > 0\n        pred_list.extend(preds.cpu().numpy().tolist())\n        label_list.extend(labels.cpu().numpy().tolist())\n        \n    acc = accuracy_score(label_list, pred_list)\n    return np.mean(loss_list), acc\n","metadata":{"execution":{"iopub.status.busy":"2023-12-13T09:28:15.044265Z","iopub.execute_input":"2023-12-13T09:28:15.044605Z","iopub.status.idle":"2023-12-13T09:28:15.144152Z","shell.execute_reply.started":"2023-12-13T09:28:15.044578Z","shell.execute_reply":"2023-12-13T09:28:15.143396Z"},"trusted":true},"execution_count":17,"outputs":[]},{"cell_type":"markdown","source":"### TensorBoard 可视化\n\n\n训练过程中可以使用如下命令启动tensorboard服务。\n\n```shell\ntensorboard \\\n    --logdir=runs \\     # log 存放路径\n    --host 0.0.0.0 \\    # ip\n    --port 8848         # 端口\n```","metadata":{}},{"cell_type":"code","source":"from torch.utils.tensorboard import SummaryWriter\n\n\nclass TensorBoardCallback:\n    def __init__(self, log_dir, flush_secs=10):\n        \"\"\"\n        Args:\n            log_dir (str): dir to write log.\n            flush_secs (int, optional): write to dsk each flush_secs seconds. Defaults to 10.\n        \"\"\"\n        self.writer = SummaryWriter(log_dir=log_dir, flush_secs=flush_secs)\n\n    def draw_model(self, model, input_shape):\n        self.writer.add_graph(model, input_to_model=torch.randn(input_shape))\n        \n    def add_loss_scalars(self, step, loss, val_loss):\n        self.writer.add_scalars(\n            main_tag=\"training/loss\", \n            tag_scalar_dict={\"loss\": loss, \"val_loss\": val_loss},\n            global_step=step,\n            )\n        \n    def add_acc_scalars(self, step, acc, val_acc):\n        self.writer.add_scalars(\n            main_tag=\"training/accuracy\",\n            tag_scalar_dict={\"accuracy\": acc, \"val_accuracy\": val_acc},\n            global_step=step,\n        )\n        \n    def add_lr_scalars(self, step, learning_rate):\n        self.writer.add_scalars(\n            main_tag=\"training/learning_rate\",\n            tag_scalar_dict={\"learning_rate\": learning_rate},\n            global_step=step,\n            \n        )\n    \n    def __call__(self, step, **kwargs):\n        # add loss\n        loss = kwargs.pop(\"loss\", None)\n        val_loss = kwargs.pop(\"val_loss\", None)\n        if loss is not None and val_loss is not None:\n            self.add_loss_scalars(step, loss, val_loss)\n        # add acc\n        acc = kwargs.pop(\"acc\", None)\n        val_acc = kwargs.pop(\"val_acc\", None)\n        if acc is not None and val_acc is not None:\n            self.add_acc_scalars(step, acc, val_acc)\n        # add lr\n        learning_rate = kwargs.pop(\"lr\", None)\n        if learning_rate is not None:\n            self.add_lr_scalars(step, learning_rate)\n","metadata":{"execution":{"iopub.status.busy":"2023-12-13T09:28:15.145248Z","iopub.execute_input":"2023-12-13T09:28:15.145581Z","iopub.status.idle":"2023-12-13T09:28:26.189766Z","shell.execute_reply.started":"2023-12-13T09:28:15.145553Z","shell.execute_reply":"2023-12-13T09:28:26.188797Z"},"trusted":true},"execution_count":18,"outputs":[]},{"cell_type":"markdown","source":"### Save Best\n","metadata":{}},{"cell_type":"code","source":"class SaveCheckpointsCallback:\n    def __init__(self, save_dir, save_step=5000, save_best_only=True):\n        \"\"\"\n        Save checkpoints each save_epoch epoch. \n        We save checkpoint by epoch in this implementation.\n        Usually, training scripts with pytorch evaluating model and save checkpoint by step.\n\n        Args:\n            save_dir (str): dir to save checkpoint\n            save_epoch (int, optional): the frequency to save checkpoint. Defaults to 1.\n            save_best_only (bool, optional): If True, only save the best model or save each model at every epoch.\n        \"\"\"\n        self.save_dir = save_dir\n        self.save_step = save_step\n        self.save_best_only = save_best_only\n        self.best_metrics = -1\n        \n        # mkdir\n        if not os.path.exists(self.save_dir):\n            os.mkdir(self.save_dir)\n        \n    def __call__(self, step, state_dict, metric=None):\n        if step % self.save_step > 0:\n            return\n        \n        if self.save_best_only:\n            assert metric is not None\n            if metric >= self.best_metrics:\n                # save checkpoints\n                torch.save(state_dict, os.path.join(self.save_dir, \"best.ckpt\"))\n                # update best metrics\n                self.best_metrics = metric\n        else:\n            torch.save(state_dict, os.path.join(self.save_dir, f\"{step}.ckpt\"))\n\n","metadata":{"execution":{"iopub.status.busy":"2023-12-13T09:28:26.191135Z","iopub.execute_input":"2023-12-13T09:28:26.191740Z","iopub.status.idle":"2023-12-13T09:28:26.200636Z","shell.execute_reply.started":"2023-12-13T09:28:26.191699Z","shell.execute_reply":"2023-12-13T09:28:26.199532Z"},"trusted":true},"execution_count":19,"outputs":[]},{"cell_type":"markdown","source":"### Early Stop","metadata":{}},{"cell_type":"code","source":"class EarlyStopCallback:\n    def __init__(self, patience=5, min_delta=0.01):\n        \"\"\"\n\n        Args:\n            patience (int, optional): Number of epochs with no improvement after which training will be stopped.. Defaults to 5.\n            min_delta (float, optional): Minimum change in the monitored quantity to qualify as an improvement, i.e. an absolute \n                change of less than min_delta, will count as no improvement. Defaults to 0.01.\n        \"\"\"\n        self.patience = patience\n        self.min_delta = min_delta\n        self.best_metric = -1\n        self.counter = 0\n        \n    def __call__(self, metric):\n        if metric >= self.best_metric + self.min_delta:\n            # update best metric\n            self.best_metric = metric\n            # reset counter \n            self.counter = 0\n        else: \n            self.counter += 1\n            \n    @property\n    def early_stop(self):\n        return self.counter >= self.patience\n","metadata":{"execution":{"iopub.status.busy":"2023-12-13T09:28:26.202113Z","iopub.execute_input":"2023-12-13T09:28:26.202549Z","iopub.status.idle":"2023-12-13T09:28:26.223965Z","shell.execute_reply.started":"2023-12-13T09:28:26.202512Z","shell.execute_reply":"2023-12-13T09:28:26.223032Z"},"trusted":true},"execution_count":20,"outputs":[]},{"cell_type":"code","source":"# 训练\ndef training(\n    model, \n    train_loader, \n    val_loader, \n    epoch, \n    loss_fct, \n    optimizer, \n    tensorboard_callback=None,\n    save_ckpt_callback=None,\n    early_stop_callback=None,\n    eval_step=500,\n    ):\n    record_dict = {\n        \"train\": [],\n        \"val\": []\n    }\n    \n    global_step = 0\n    model.train()\n    with tqdm(total=epoch * len(train_loader)) as pbar:\n        for epoch_id in range(epoch):\n            # training\n            for datas, labels in train_loader:\n                datas = datas.to(device)\n                labels = labels.to(device)\n                # 梯度清空\n                optimizer.zero_grad()\n                # 模型前向计算\n                logits = model(datas)\n                # 计算损失\n                loss = loss_fct(logits, labels)\n                # 梯度回传\n                loss.backward()\n                # 调整优化器，包括学习率的变动等\n                optimizer.step()\n                preds = logits > 0\n            \n                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())    \n                loss = loss.cpu().item()\n                # record\n                \n                record_dict[\"train\"].append({\n                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n                })\n                \n                # evaluating\n                if global_step % eval_step == 0:\n                    model.eval()\n                    val_loss, val_acc = evaluating(model, val_loader, loss_fct)\n                    record_dict[\"val\"].append({\n                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n                    })\n                    model.train()\n                    \n                    # 1. 使用 tensorboard 可视化\n                    if tensorboard_callback is not None:\n                        tensorboard_callback(\n                            global_step, \n                            loss=loss, val_loss=val_loss,\n                            acc=acc, val_acc=val_acc,\n                            lr=optimizer.param_groups[0][\"lr\"],\n                            )\n                \n                    # 2. 保存模型权重 save model checkpoint\n                    if save_ckpt_callback is not None:\n                        save_ckpt_callback(global_step, model.state_dict(), metric=val_acc)\n\n                    # 3. 早停 Early Stop\n                    if early_stop_callback is not None:\n                        early_stop_callback(val_acc)\n                        if early_stop_callback.early_stop:\n                            print(f\"Early stop at epoch {epoch_id} / global_step {global_step}\")\n                            return record_dict\n                    \n                # udate step\n                global_step += 1\n                pbar.update(1)\n                pbar.set_postfix({\"epoch\": epoch_id})\n        \n    return record_dict\n        \n\nepoch = 20\n\nmodel = LSTM()\n\n# 1. 定义损失函数 采用交叉熵损失 (但是二分类)\nloss_fct = F.binary_cross_entropy_with_logits\n# 2. 定义优化器 采用 adam\n# Optimizers specified in the torch.optim package\noptimizer = torch.optim.Adam(model.parameters(), lr=0.001)\n\n# 1. tensorboard 可视化\nif not os.path.exists(\"runs\"):\n    os.mkdir(\"runs\")\ntensorboard_callback = TensorBoardCallback(\"runs/imdb-lstm-subword\")\n# tensorboard_callback.draw_model(model, [1, MAX_LENGTH])\n# 2. save best\nif not os.path.exists(\"checkpoints\"):\n    os.makedirs(\"checkpoints\")\nsave_ckpt_callback = SaveCheckpointsCallback(\"checkpoints/imdb-lstm-subword\", save_step=len(train_dl), save_best_only=True)\n# 3. early stop\nearly_stop_callback = EarlyStopCallback(patience=10)\n\nmodel = model.to(device)\nrecord = training(\n    model, \n    train_dl, \n    test_dl, \n    epoch, \n    loss_fct, \n    optimizer, \n    tensorboard_callback=tensorboard_callback,\n    save_ckpt_callback=save_ckpt_callback,\n    early_stop_callback=early_stop_callback,\n    eval_step=len(train_dl)\n    )","metadata":{"execution":{"iopub.status.busy":"2023-12-13T09:28:26.225690Z","iopub.execute_input":"2023-12-13T09:28:26.226133Z","iopub.status.idle":"2023-12-13T09:33:17.917158Z","shell.execute_reply.started":"2023-12-13T09:28:26.226087Z","shell.execute_reply":"2023-12-13T09:33:17.916259Z"},"trusted":true},"execution_count":21,"outputs":[{"output_type":"display_data","data":{"text/plain":"  0%|          | 0/3920 [00:00<?, ?it/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"1dc852e3e25f4e3eb943d234cec77a65"}},"metadata":{}}]},{"cell_type":"code","source":"#画线要注意的是损失是不一定在零到1之间的\ndef plot_learning_curves(record_dict, sample_step=500):\n    # build DataFrame\n    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n\n    # plot\n    fig_num = len(train_df.columns)\n    fig, axs = plt.subplots(1, fig_num, figsize=(5 * fig_num, 5))\n    for idx, item in enumerate(train_df.columns):    \n        axs[idx].plot(train_df.index, train_df[item], label=f\"train_{item}\")\n        axs[idx].plot(val_df.index, val_df[item], label=f\"val_{item}\")\n        axs[idx].grid()\n        axs[idx].legend()\n        # axs[idx].set_xticks(range(0, train_df.index[-1], 5000))\n        # axs[idx].set_xticklabels(map(lambda x: f\"{int(x/1000)}k\", range(0, train_df.index[-1], 5000)))\n        axs[idx].set_xlabel(\"step\")\n    \n    plt.show()\n\nplot_learning_curves(record, sample_step=10)  #横坐标是 steps","metadata":{"execution":{"iopub.status.busy":"2023-12-13T09:33:17.918455Z","iopub.execute_input":"2023-12-13T09:33:17.918722Z","iopub.status.idle":"2023-12-13T09:33:18.388282Z","shell.execute_reply.started":"2023-12-13T09:33:17.918698Z","shell.execute_reply":"2023-12-13T09:33:18.387318Z"},"trusted":true},"execution_count":22,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 1000x500 with 2 Axes>","image/png":"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YJ29bNkytm3bBgRS3C699NLg/Ndffz2bNm3ijjvuYM2aNbzwwgt89NFH3HbbbTU2RqPviPoZrum/RL8j6fz98Pl8XHXVVXTu3JmMjAx69uzJM888EzHf1KlTg9+Z1q1bM3HixOBrBw8e5LrrriMvLw+n00m/fv34+uuvE9q+IGhZvLWQS6cuYMO+kroeipACJDIURoXHx0s/bQLg+uO70qpRw84TFoRUUO7x0eee7+pk26seGEemPbGfsmeeeYZ169bRr18/HnjgAQD+/DNw4+POO+/k8ccfp0uXLjRp0oTt27czfvx4HnroIRwOB2+99RYTJkxg7dq1dOjQIeo27r//fh599FEee+wxnnvuOS666CK2bt1K06ZNk9qvxYsXc95553Hfffdx/vnnM3fuXG688UaaNWvG5ZdfzqJFi7j55pt5++23GTlyJIWFhfzyyy8A7N69mwsuuIBHH32UM888k+LiYn755ZekhGN9YtGiRZxwwgnB52ptz2WXXcYbb7zB7t27g8IIoHPnznzzzTfcdtttPPPMM7Rr145XX301pbba4dSH70g6fz/8fj/t2rXj448/plmzZsydO5drr72WvLw8Tj75ZABefPFFJk2axH/+8x9OOeUUDh06xG+//RZc/pRTTqG4uJh33nmHrl27smrVqgbvEifUDGe/OA+Aa99axA+3j6rbwQjVRsRQGD5/6GLB7RW7U0FoSDRq1Ai73U5mZiatWrUCYM2aNQA88MADjBkzJjhv06ZNGThwYPD5gw8+yGeffcaXX36pu9sczuWXX84FF1wAwMMPP8yzzz7LggULghdsifLkk09y0kkncffddwPQo0cPVq1axWOPPcbll1/Otm3byMrK4rTTTiMnJ4eOHTtyxBFHAAEx5PV6Oeuss+jYsSMA/fv3T2r79YlRo0bFFHpvvPGG4TJLly6twVHVP9L5+2Gz2XRufp07d2bevHl8/PHHwWX//e9/8/e//11n2HDkkUcC8P3337NgwQJWr15Njx49gIDBgyBUh22FqXM0E+oOEUNheH2hE6qvgd5FFYRUk2GzsOqBmrurHo7f76e4qJic3BwybKm5szt06FDd85KSEu677z6++eaboLgoLy/XRRiMGDBgQPBxVlYWubm57Nu3L+nxrF69mtNPP1037eijj+bpp5/G5/MxZswYOnbsSJcuXTj55JM5+eSTg+lHAwcO5KSTTqJ///6MGzeOsWPHcs4559CkSZOkxyGkhvDviPYzXNMGCqn4jqTD9+P5559n6tSpbNu2jfLyctxuN4MGDQJg37597Nq1i5NOOslw2WXLltGuXbugEBKEVCDXiQ0DEUNheDVN27RRIkEQomMymRJOVUsFfr8fr91Cpt2aMjvdcFe422+/nVmzZvH444/TrVs3MjIyOOecc+L2jQl3uDGZTDXSVDMnJ4clS5YwZ84cZs6cyT333MN9993HwoULady4MbNmzWLu3LnMnDmT5557jn/961/Mnz+fzp07p3wsQnzCvyPaz3A6uclFo66/Hx988AG33347TzzxBCNGjCAnJ4fHHnuM+fPnA0R1AVSJ97ogVAXRQg2D9P8FrmW8GgHk8UmanCA0NOx2Oz6fL+58v/32G5dffjlnnnkm/fv3p1WrVmzZsqXmB1hJ7969g/UO2jH16NEjWOdgtVoZPXo0jz76KH/88Qdbtmzhhx9+AAIXmUcffTT3338/S5cuxW6389lnn9Xa+IX6Sbp+P3777TdGjhzJjTfeyBFHHEG3bt3YuHFj8PWcnBw6derE7NmzDZcfMGAAO3bsYN26dTU2RkE4HNiwr4Sb31/K+r2JNTp2e/3845M/+Gr5rhoeWdWpkhh6/vnn6dSpE06nk+HDh7NgwYKo844aNSroSqP9O/XUU6s86JpEK4CkZkgQGh6dOnVi/vz5bNmyhYKCgqh3pbt37860adNYtmwZy5cv58ILL6yRCE80/v73vzN79mwefPBB1q1bx5tvvsn//vc/br/9dgC+/vprnn32WZYtW8bWrVt566238Pv99OzZk/nz5/Pwww+zaNEitm3bxrRp08jPz6d37961Nn6hfpKu34/u3buzaNEivvvuO9atW8fdd9/NwoULdfPcd999PPHEEzz77LOsX7+eJUuW8NxzzwFw/PHHc9xxx3H22Wcza9YsNm/ezLfffsuMGTNqbMyC0BC5+NX5fLl8F5e8Fv3aX8u0JTv4cNF2/vZ++tZoJi2GPvzwQyZNmsS9997LkiVLGDhwIOPGjYua8ztt2jR2794d/Fu5ciUWi4Vzzz232oOvCXQGChIZEoQGx+23347FYqFPnz60aNEiao3Dk08+SZMmTRg5ciQTJkxg3LhxDB48uNbGOXjwYD766CM++OAD+vXrxz333MMDDzzA5ZdfDkDjxo2ZNm0aJ554Ir1792bKlCm8//779O3bl9zcXH7++WfGjx9Pjx49uOuuu3jiiSc45ZRTam38Qv0kXb8f1113HWeddRbnn38+w4cPZ//+/dx44426eS677DKefvppXnjhBfr27ctpp53G+vXrg69/+umnHHnkkVxwwQX06dOHO+64I6EomCAIIfYUVej+x6OwLHbqbDqQdJL/k08+yTXXXMMVV1wBwJQpU/jmm2+YOnUqd955Z8T84XaZH3zwAZmZmWkrhjw+cZMThIZMjx49mDdvnm6aKjC0dOrUKZhypnLTTTfpnoenBRk5mh08eDChcRk5op199tmcffbZhvMfc8wxzJkzx/C13r17yx1voUqk6/fD4XDw+uuv8/rrr+umP/TQQxQVFQWfX3fddVx33XWG62jatClTp05NaHuCIKQGuyX9K3KSEkNut5vFixczefLk4DSz2czo0aMjfjyj8dprr/HXv/41ohhTi8vlwuVyBZ+rP3QejwePx5PMkIPLaf/HosIVUrBlLneVttdQSeY4CtFpCMfR4/GgKAp+v79WU8dU1IsqdQxC1dAeR0VR8Hg8EX1X6vPnVBAEQahbHNaQGPL6/FjTUBwlJYYKCgrw+Xzk5eXppufl5QV7EcRiwYIFrFy5ktdeey3mfI888oiun4DKzJkzyczMTGbIAJR4YNZOM/u/mkWzOD1Ud5SCeljmzV9E2QaxCgln1qxZdT2EBkF9Po5Wq5VWrVpRUlIS1z2qJikuTqyAMx247bbb+Pjjjw1fO/fcc3nqqadqeUQhSktLKS8v5+eff8br9epeKyuTPhpCzXP99dfzzjvvGL528cUXM2XKlFoekSDUHH6/wmMz1zK4QxPG9NFfU6/ceYhPFu/glpO60yTLnvA6F24pZPqK3fzfuJ4pd3f9ZX0+P6/L546TewWnmRM0crVrxFCp20ejjHouhqrLa6+9Rv/+/Rk2bFjM+SZPnhzsIA6ByFD79u0ZO3Ysubm5yW3U5+aTqY/h32vn+aIj+f3OUbqX1+8tYX+pm6O6BNL5lu84BH8ErDr7DxzE+AGtk9teA8bj8TBr1izGjBkTYY8qJE5DOI4VFRVs376d7OxsnM44dxhqAEVRKC4uJicnJ2XW2jXNI488oouqa8nNzU3+ty0FqMcxKyuLjIwMjjvuuIj3U5uCJAg1xQMPPBA0BwmnLr4bglCTzF6zjxfnBNwQt/xHbyh22nO/AnCwzM3Tfz0i4XWeOyWQoeW0WfiHRrSkAtUsoV2TUEBCK3Jioc2OLXF5aZSRftc9SYmh5s2bY7FY2Lt3r2763r17g92qo1FaWsoHH3zAAw88EHc7DocDh8MRMd1msyV/8Tj/f1yw7ykGWTswvrQ/Ww+46Noii3kb99O3bSPG/28uAL/ccQLtm2aCKfTm+jDX24vVmqRK74MQQX0+jj6fD5PJhNlsrpMeKWpqnDqG+kCrVq3i/k7WNtrjaDKZDD+T9fUzKtQvWrZsScuWLet6GIJQKxRXxE8/XrOnapkPa3bX3A2szQWlwce2BNPdtGZkJRXeGHPWHUldRdjtdoYMGaLz8ff7/cyePZsRI0bEXPbjjz/G5XJx8cUXV22kVUQZfBklZNDbvI2x5kWMfvInnp29gQtfnc+lr80PzpdfEqhR0vYZEgMFQRAEQRAEIZU0zgzdZCpzGwsEcxWzHrTXsalG67jsSDAypL2WLnGlZw1q0rdUJ02axCuvvMKbb77J6tWrueGGGygtLQ26y1166aWGqSCvvfYaZ5xxBs2aNav+qJNgjyeDqd5xANxi/QwTfp76PtB0bfmOQ8H5VLcLr85NTiw3BUEQBEEQhNThtIWMagpLjetuLYkW5YRRkzfyvRrDokRd4lya8RSnaWQo6Zqh888/n/z8fO655x727NnDoEGDmDFjRtBUYdu2bRFpK2vXruXXX39l5syZqRl1EqzcWcRr3vFcZZ1BH/NWxpoX853/yIj51GarHs0bLX2GBEEQBEEQGgZb95cybclOLh/ZKSlzglSjraMpLHWzdk8xuw6Wc8mITsHp5iqKoZqMDJW6QkECo5qhGSt389O6fMb2aUWbxhm88/tWPlu603D5dKJKBgoTJ05k4sSJhq8Z9b3o2bOnYX+B2qBplo3jBnRjzvZxnFr+BTdbp/Gdeyig/5CpStqniQw9PH0NfVo34pjuzWtzyIIgCIIgCEKKOfOFuRSWutmwr4TnL6q9JtrhaNPNCkvdXPXmIgCO6hLKnrJU0RvIU4M38g+Wh9Lcwi2yFUXhhneXoCjw6eKdHNejBd+v1nsMNJg0ufrGkI5NefLcAZi6jcVryaSveStjzYsi5lObrXrDepZcrKkrEgRBEARBEOonakra/M3763QcPk2AYPehiuDjUncoclLVNDmPr+aCDwfLQil9vrAIlNvnD0a83D4/y3ccjFg+XdPkGrwYUvFYc9jf93IAbrFOA/RvYjBNrgY/RIIg1H86derE008/ndC8JpOJzz//vEbHIwjpRDLfD0GoKxJ1QqsptNlSG/aVBB9n2kO1RFU1UKjJyNABjRgKr02qcOuf5xe7IpYvcYkYqnMyjptIieKkr3krTw3chVWjutX6oPDIkCAIgiAIgtBwqGsxpNUr6zViSBttsSaRJ6ddLtViSCvcDpWF0txcYWKozBNf6JSKGKp7Mhq1pLAyOnTmobeZe+cJwdfUD49XIkOCIAiCIAgNllhCY29RBVN/3UxRjF5A2qCNvwqGBX6NwNioEUNvzdsafJxoZOiTxTuYvymU9hfvOnbhlkI+W7rD8LXCUjdTf90cTCcsdXl59ZfNwdeLNGluBSUu/jtjDTNW7mbKTxt5cua6uGMtcXmZu7GA6St2x523NjmsxBBAh1PvAHs27PmDlrt+5NhKc4SgGKpBFw7BmP0lLh77bg1bNM28hHqGooC7tHb/PGWB/0mYs7z88su0adMm2GxU5fTTT+fKK69k48aNnH766eTl5ZGdnc2RRx7J999/n7LDtGLFCk488UQyMjJo1qwZ1157LSUloRPhnDlzGDZsGFlZWTRu3Jijjz6arVsDJ8fly5dzwgknkJOTQ25uLkOGDGHRosj6RyFNMfqOqJ/hmv5L8DtS29+PJ598kv79+5OVlUX79u258cYbdd8HgN9++41Ro0aRmZlJkyZNGDduHAcOHAACfQ4fe+wxBg8eTEZGBh06dOChhx6q8niEwwdbjGbd506ZxwNfr+Lx79ZGncdiiswsSgatgNp5sDz4+P0F20LbSKBm6Jf1+dz+8XIufDVU3x5vPOdOmcdtHy5n0ZbCiNdufn8pD3y9ils+WArAv79ZxUPTV0dd14tzNnL9O0v4z7dr+HixscDSUlzh5cJX5nPju0t0+13XVMlNrl6T1QyGXQO/PgVzHsHueAIAj7fSQEHstGud//vkD35Ys4+3523lj/vG1fVwhKrgKYOH29Ta5sxAY/XJP3eBPSuh5c4991z+9re/8eOPP3LSSScBUFhYyIwZM5g+fTolJSWMHz+ehx56CIfDwVtvvcWECRNYu3YtHTp0qNaYS0tLGTduHCNGjGDhwoXs27ePq6++mokTJ/LGG2/g9Xo544wzuOaaa3j//fdxu90sWLAAU+VJ96KLLuKII47gxRdfxGKxsGzZMmw2W5ytCmlD2HdE9xmuaRL8jtT298NsNvPss8/SuXNnNm3axI033sgdd9zBCy+8AMCyZcs46aSTuPLKK3nmmWewWq38+OOP+HyBIvPJkyfzyiuv8NBDDzF69Gj27t3LmjVrkh6HcPhhs0YXGtsKywD4fVN0k4VA1CZw3ejx+XV9gxIhkfvulgQiQ7+uL4iYVuFOzL56/uZChnZqql/fhsD6fqlc76xV+xJaV6LsLwnVHB0q89C2cUZK119VDj8xBDDibzD/ZdjzB4NbzWc2XXBJZKjOUO9OFKWpy4jQcGjSpAmnnHIK7733XvBi75NPPqF58+accMIJmM1mBg4cGJz/wQcf5LPPPuPLL7+M2k4gUd577z0qKip46623yMoKXJj+73//Y8KECfz3v//FZrNx6NAhTjvtNLp27QpA7969g8tv27aN//u//6NXr14AdO/evVrjEYRwavv7ceuttwYfd+rUiX//+99cf/31QTH06KOPMnTo0OBzgL59+wJQXFzMM888w7PPPst5551Hbm4u3bt355hjjqnKrguHAdq6mmg1Q9r6mA5NM6OvTKNTqtLk1JdAtDaRPkNG0ZUStxe/XzFcXrt/uxKIzFSlLU7HZpls3V9m+NruQ6FtxgjO1TqHpxhSo0O/Pc2EA2/xGPfi8UavGVIUJXh3Vkg9VbWPFNIIW2bg7nMt4ff7KSouJjcnB7MtxgnLgIsuuohrrrmGF154AYfDwbvvvstf//pXzGYzJSUl3HfffXzzzTfs3r0br9dLeXk527Zti7/iOKxevZqBAwcGhRDA0Ucfjd/vZ+3atRx33HFcfvnljBs3jjFjxjB69GjOO+88WrduDcCkSZO4+uqrefvttxk9ejTnnntuUDQJ9YCw74juM1zTVwVJfEdq8/vx/fff88gjj7BmzRqKiorwer1UVFRQVlZGZmYmy5Yt49xzzzVcdvXq1bhcrqBoE4R4lLpDN1yjpcntLQo5oLVuFD1qoRUJ1U2Ti0YiV0ZGYkhRoMzjI9sReYmvNT1IJE3NXwUx1DTLjtenGK5/l8ZGvMKTPplYaaTLapmRfwNbFh1c6zjRvDRkrW3gJhfumCGklqraRwpphMkUSMOpzT9bZuB/kp+fCRMmoCgK33zzDdu3b+eXX37hoosuAuD222/ns88+4+GHH+aXX35h2bJl9O/fH7fbHWetqeH1119n3rx5jBw5kg8//JAePXrw+++/A3Dffffx559/cuqpp/LDDz/Qp08fPvvss1oZl5ACjL4j6me4pv+S+I7U1vdjy5YtnHbaaQwYMIBPP/2UxYsX8/zzzwME15eREf1iNNZrQu2xKb+EGSv31Pp2iys8fLZ0B8UxTA7C0TqZKRhf5K/fVxx8/MfOQ4ZpaKDPIgqPDG0sgsVbD8QcSyIiw+tX8Pr8fLZ0B3uLKiJe35RfwtJtBw2XLdFk2izeeoC5GwsoqvDw3vzQjYsdB8rZX+Lis6U7qPAYp9ZVJVkqw2ahW8tsw9e0x8oVZZt1weErhrKaB6JDwK3WT/F4A2+KzyAyFO1DIqSGRELBgpAqnE4nZ511Fu+++y7vv/8+PXv2ZPDgQCfy3377jcsvv5wzzzyT/v3706pVK7Zs2ZKS7fbu3Zvly5dTWhoyCvntt98wm8307NkzOO2II45g8uTJzJ07l379+vHee+8FX+vRowe33XYbM2fO5KyzzuL1119PydgEQaW2vh+LFy/G7/fzxBNPcNRRR9GjRw927dJHlwcMGMDs2bMNl+/evTsZGRlRXxdqhxOf+Inr31nML+vza3W7b/y2hds+XM6bc7ckvIxWIERLbdMaOS3ffpCLX5uvS+2CQFRHq2W06yp1eXn2Tyt/fXVhzGvH8IalRnh8fp7/cSO3fbicy6YuiHj99o+XR11WFYkur4+zX5zLha/M59q3FvHA16uC82zbX8YVbyzktg+X88RMY7MII9GWYxBx0pJpt9CrVU7MeQJjS59Aw+ErhgBG/g232ckA82baFvwKgMfgA1ouYqhGES0k1DYXXXQR33zzDVOnTg3e9YbABda0adNYtmwZy5cv58ILL4xw1qrONp1OJ5dddhkrV67kxx9/5G9/+xuXXHIJeXl5bN68mcmTJzNv3jy2bt3KzJkzWb9+Pb1796a8vJyJEycyZ84ctm7dym+//cbChQt1NUWCkCpq4/vRrVs3PB4Pzz33HJs2beLtt99mypQpunkmT57MwoULufHGG/njjz9Ys2YNL774IgUFBTidTv7xj39w55138sEHH7Bx40Z+//13XnvttWrtu1A1okUoaordlZGS3YciIybRKNZEhqKlaBUb9MHZE7aN8Npy7UW9tvY5lhhKJPvM4/Pz9u8BN9E1e4ojXj9QFj0qpr62pSBUu/P7Jr17nNvn548dh4CAPXei4+yWZxz1UXHaLFxxdGeuP74rVxzdKep86RRoOLzFUFZzFrU8B4Duq55jze5Dhm5y5Qk6cwhVQ9LkhNrmxBNPpGnTpqxdu5YLL7wwOP3JJ5+kSZMmjBw5kgkTJjBu3LjgXfHqkpmZyXfffUdhYSFHHnkk55xzDieddBL/+9//gq+vWbOGs88+mx49enDttddy0003cd1112GxWNi/fz+XXnopPXr04LzzzuOUU07h/vvvT8nYBEFLbXw/Bg4cyJNPPsl///tf+vXrx7vvvssjjzyim6dHjx7MnDmT5cuXM2zYMEaMGMEXX3yB1Rq4M3333XczadIkHn74Yfr27cv555/Pvn2pdb8SEqO2nXjVKE9JEk08tZEhl9f4us7IiS38GsUbdgNAWzOkbXgay1ghEQMFr0+hoMQV9fVYzVULSwPLadP+YuGJ0pvIKDLUrUVsMZRhs9CqkZM7T+lF95bRI0TpFBk6PA0UNCxsczGDdn9MP9MmLn/uOXoec3bEPGVhX44yt5fiCi95uc7aGmaDRsSQUNuYzeaIlBwIOFr98MMPumk33XST7nkyaUHhTjz9+/ePWL9KXl5e1Bogu93O+++/n/B2BaE61Nb347bbbuO2227TTbvkkkt0z48//nh+++23qOP85z//ycSJE8nNza15IwohKkZZNTWJKoJKknCh1QqnaBfiRplAkWJIv68eXR2M5nEsMZRImlyceWKto7A0EBnasK8k6jxaogk3IzHUJZ4Ysls0j6N/J9NJDB32vxw+Z1Pe8o0B1NqhyDcnPJR3wztLOOqR2WyWJqEpQc5fgiAIglB/cHv9zFkbisIlcnEfbT0zVu7huz/3REQ6theWsWSbsRFBUAwlExlKQAyF3/wOzOvjx7X7gllC4bXlCzYXsqWglENlHmau3qdbLhqJWFYv334w+LhRRqinnNvr58e1+ygqj54mV1jqorjCw3M/bIi7HQhEt8LH6/L6DA0U2jaJbV6iE0Mx+i+9MXez7jNUlxz2l6E2i5lXvKdSpjgYZN5E54ORd6C0dwq8Pj8/rctHUeCTxdtrc6gNlkQaiwlCuvHuu++SnZ1t+Kf2QhGEwxX5fjRs/vPtGi5/fWHwuVFbkkT4fOlOrn9nMde9vZhv/tite+3YR3/krBfmsik/MrpR3TS5aPUqRpGhuz5fyRWvL2TSR8uAyMjQE7PWMerxOVz02u88PTskPmJZRycrHp220OX64zPXcsXrCymtFGcOa+Sl/P5SN0/MXJfUdsKjbKUun6Fo6x7FKU7FoenhlGGPnoC2cmcRL/y4MeHx1SSHfZqczWpmP4142zea66zfMGrPVOAubjqhG79t2M+y7Qd1dwo2aaJB6eSRXp+RNDmhPvKXv/yF4cOHG75ms9kMpwvC4YJ8Pxo271QW9quE19Ekyi6NU9seA/togFW7iyJSs6oSGdIKnWiRISORpJoXfFtpIR5NYKzcWaR7HisylGwgTVu7/vY8/bHPcdpwhdUWHSh1J3VsIPJYllR4I/b1/8b1pHfr3ODzdk0yGN07jyM7NeWm95YA+n2LFRkCyHamhwxJj1HUIWoX4le8p3GpZRbty1YzyrycTHsvshyBN3Hr/lI27CuhW8tsVu0KfdjXJ5iLKcRGtJBQH8nJySEnJ759qCAcjsj34/AiWgF+PLSiJJbhQDhVqRnSCgpfZQ8fq0UfVTFKkwsnUeHninHDPNlmplohF26+kOO0Rhgt7C91B4+n1WyKiGYZcTDMna7Y5dEJm4HtG3PTCd1082TaLdz3l766CJJ2fPHEUFYcm+7a4rBPk7NXhhcLaMTblbVDt1inYTOH3sSHp69h/LO/sLeoglW7Q2Jo6dYD3Pfln1FzWoXEsIi3dr0lkbxnIf2R97FmkONav5H3LwZhp21fFSNDWsGgFUPaiIQpfGOERJCRFXY0wlPgKgzEVyLuwYmmnsUyCEhWDHl8SrCmKvxzma0RFK0bBYy9CjWRoVaNEjP72nFA308pXGj6DfZbvYY2ae5qa4+PwxZbZmSLGEoP7JbQG/iy9zRcJgdHmDfQ8cDvODWK1u31s3jrAf7YcTA4rdjl5Y25Wzjrhbk8/+OGtPJMr09Imlz9Q01zKSsrizOnUB9Q30dJX0oN8v1oGNTG90JRFFbsOMT+EhcrdhxKCwHm8yss3XYgqUiN1x+4WF+67UBSNtsVmlQyt8/P+r3F7C9x6VLMFML7+viCdtZurx+314/fr7Bs+0Hyi12s3HkoOG+528cfOw6iKEpE1OfPnYeYvXovpa7EegOpJBoFK6rw8PO6fJZuO8CGfSW6fkWJHiKtccL2wjI27CuJEGM5zkgx9OeuomAPptYJiqFfN+gb5x4MM2gwEoF2S6SM0M4X72Z3jqTJpQc2zRtZQCOmO07hzIrPGbz5Jb7Oe0Y376pdRSzffih8FQA89t1a3F4/t43pUaPjbYiYRAzVOywWC40bNw729MjMzKzV99Hv9+N2u6moqBA73Wrg8/koLi6muLiYJk2aYLHETmkQEiOR74d8hlNDTRxHRVEoKytj3759NG7cuEa/F9+s2M3E95YGnz91/kDOPKJdjW0vEZ6dvZ5nZq/ngmHteeSsAQkt4/Up3PPFSt5fsJ3rj+/Knaf0Smg5bWRo3d5ixjz1MxaziUX/Gh2cHq4PS12+sOdePl2yg39/szo47f1rjmJE12bc9+WffLhoO+9cNTxC6Jz/8u8AnHlEW546fxCQWJpcopGhZ75fr6szd1jNrHnwZEwmU8KRoUYZNooqPCgKnPjET4bzaKMrbZtksqSyAW5hqRsg4TYw7y/Qm4LlF+tT74zG3Ll5pJlC82xH8HGmPU7NUJpEhtJjFHWILUzVvs5fOFmZTotDfzCsxVK+olXwtc+W7qTc4yPHacVqNkV0/5V0uaphcGNBqAe0ahX4btRFk0NFUSgvLycjI0PEdDVQFIXS0lJat24dfD+F1BDv+yGf4dRQk8excePGNf69+HjRDt3zDxdur3Mx9Mzs9UDg4jiaGAo/0l6/n/cXBHpTTflpY+JiSBMB+nV9ARAQG64oKXMQmb5V4vIy5Se9K9m787cyomszdh4MpH5tLSyNmgK3U5MeZuQmF06iNUObwtqvuLx+CkrctMhxGKacGZFpt5Bhs8QUaTnOUPRoWOembC8sY5nGlrtVFXti7jqoT5vTaqG3rhzGh4u2869TewenPX/hYGau2sPlIzsFp7VulMGNo7qSYbPwxKx1EdtIl5qh9BhFHRIuhjZXZPOu7ySutn7LOcXvsnDA4/Rqk8ujM9YGv1RHdGjC1v2lEWIonRpI1SckTa5+YjKZaN26NS1btsTjid7voCbweDz8/PPPHHfccZLaVQ28Xi8//PADgwYNkgvyFBPv+yGf4dRQU8fRZrPVSqQ0/G57GmTJJUT4z0VVrbW1rrzaIn9tFCc8olPsCiv0r/BGGASo12tqOl2520dZFKHj1uSspbJmyIgN+0pokeOIMEHQckq/VkHnugy7hUx7PDEUupTv1iKbJ88bqIsixasZ6tsml71FrggThp1hYkg75uN6tOC4Hi10r586oDWnDmgdsf47Tg4IYyMxlCNiKD2wW/Xf6OIKLy8xgSvsP5CxdzHPjjnA3pZ9eHTG2uA8XZpnUVjqCl+ViKEqImKofmOxWGo9vcpiseD1enE6nXIhWQ08Hk9a1Cg0ZKJ9P+QznBrq+3Gsr2IonKoKhGj20wfK3Jp59NdWRpGh8O2rUQ2PRgxVRBEU2maviUWGqiOGihnRtVlMa21tvXqGzaJ7boRNU/verWV2RB1PPDGU7bBS5vRFiKHwyFCypg+JkC7W2od9glJ4ZAggn8Zs6Xx+4MlP/6Vppv4HtkmmnRxH5I9uMsWGQggxkxMEQRDqCkVR2FJQmnDqUioJv4jXXnC6vL6Iu/OJUO72sedQBbsOllPmTq7XTFXxhO3HvqIKtu0vY8HmQtbvDfTp2XOoImI80W4i7y/RiqGwGiF3eHNQb8R7t7fIxfbCsmCkp9zjiyp0yj0+theWBVIuExBD6nvWNMsed95w1u4tZuv+2J81bRNVh9Uc155aW9vTPNseYUrQJDP2OHOc1mArGQhFa8Jr5GtCqEvNUJpg5IQBsLXn1XTd+hFsn49t60/kOK0UV96NaJJlM3TAcMdosCVERyJDgiAIQl3x5twt3PfVKi45qiMPntGvVrcdfk2sFUPnvDiPFTsP8dXEY+jfrlHC6zzpiTnsqnQS69Yym+8nHZ+SscYi3EFu2MOzdc8fPKMfd3++khY5DhZqzBGiiiFN9k14v57isMhQsSsyTQ7g2Ed/DD6OJYY25Zdy7KM/8sxfByV0wa+mBDbJtAVNChLlnd+38c7v2+jcPCvqPNpIkM1ijmtCkKF53WQyRaQwGtXltMxxsK9SRGU7rDpR0r5pJqt2F+nSB0EiQw0am9X4EHiz8mDolYEnc/5DE429YeNMu+EbKGlyVcMsoSFBEAShjnj0u0Aa/Nu/b631bYdHCLTPVlRaRH++bGdS69ylsXA2smKORaJps+G9f+LVDL0/fxsQ6VDmiiJQCjSRoYqwG80lYb2FSiq8cS/Uy92+YJQo2k3wp79fH3MdKqqBgs1i5m8ndtPZXxtx7XFdaJ6tj85sDjNX0KKNDNks5phpcmYT3HxSd47u1owpFw82nCc8+tK9ZTYfXz+CY7s3p3frXM4b2p5sTbZTx2aZhuupTq1UNNIlMnTYi6FoXwqbxQxH3wJWJ2yfzyj7quBrTTJt5DojP/wihqqGaCFBEAShrqjLU1D4RbzR9aZROn8y7DyQeKpdaQIGAkaERxHC0Tbf1Ka9JZQm54lXM+SJW8ejjQy1yHEYznOosq9OvGQVdVtWi4m/j+3Jq5cNjTpvlt3CP8f35u2rhsdeqQaHLjJk0kV+wrGazbRulMG7Vx/Fyf0izQsgspfPh9eNoGOzLN6+ajjf3nIsI7s1183ToWlIDI3s2iz4uCbSSEUM1QdyWsGQKwC4pOJd1Hs2TTIjczJBaoaqSrymXIIgCIJQU9Slk2LE9aVBhEPbHD4eRoYEG/KLE15ea1wA0aMB4YcsXrNSq+Y8f6A05AYXLTKkS5MLu7YqNYgMxQtoaSNDzaOIoYOV+x7P4cxXGQWzVva1inVB36SyriiZ+iJtZMhqiV0zZE3gsxE+PrtBRpS2Zqi9Rgx1aRFK56uJkjpJk0sTPFHuZuwrrgwzH3MrWJ10d63iWPMKABpn2gw//CKGqobUDAmCIAh1RW2fgQ6WuYPpaNEiQ9q78NY4kSGX1xcUCDsMokDr95YkPLbCUr1ttTYlze9XOFjmptTljbjeiXf9o63X0QqdigQiQ5HW2uGRofjRrDJ3KDLUMooYUg95pj32BXowMlQp8GKJoWaVIiieiYEWrXCMFxmKdjNZ6zCXabfoxKtRRpQ2TU4bGcrLCTnRxbIDrypZcY51bXHYiyHth75xpWtcrtPKCb1aBibmtIKhVwHwd+vHgEKTTLthQVq8MLFgjPQ3EQRBEOqMWjwFfbtiN4MemMV/vl0DGImhwHOtY1q8u/8nPv4Tfe/9jrfmbeEkTX8ZlQ37EhdD4ZEhbRTm9k+WM+iBWfS997uItLR4ZQJlGsGiNR2IXjMUPTKkpsmpEZziivh97rT7FS1NTsVpi31prEbLLAmIITUiZBSNiYZW4FjNcSJDUcRQ60YZwccmk4lszbWuzeDzpM120kax2jQOrSdebVRVSJfMoPSQZHVIz1Y5/O3EbrRq5OTCYR0A8PgU/Qf3mFtxL3iNQWzkBPMyMu2nGkYzaqK47HAgiQwAQRAEQUgptXkKeuDrQP3xSz9vYvL43oTfQ1UvI7QRmXg35FX77Xu++NPw9b3FkX0Ro1FUHtnDR2XakuhGDtH6BRmtRyeGorrJRbfWVtfVqpGT4n0lCTm6HdDM0zw7thiKd9GvGiioItXo5rhK2yYZUV+Lhk4MWUw0yYw+XovZWGS9ePFg/v7Rcu44uScQSEcrdnmxW82GN6C1gi7LYeX647uydNsBTh3QmkYZNp6YtY6nzh+Y9L5oef3yI3n0u7X89+z+PPbdWnq3zq3W+lLJYS+GAP4+tqfueXgjVrJbMq/ZWRyf/x6TrB9j4l9xC+yExJE0OUEQBKGuqM3shPA74eHubepzrUlArBS0RNzfjJrERyPcqS3cxjoaFZ44kSF3ZGTI6/NHNT7YHysypBFD6/eVsFvjnhcNVVzZrWZy49SpNIlT3xOKDJmD61SxWUxc2MXLm+sD0ZxuLbLjji0c7WfEbjHTvWX0dUSLDPVt04gZtx4XfK6KnWimYdpUvGyHlTtP6RV8PrpPHqP75CU2+Bic0KtlMOsqGUOJ2uCwT5NLlD86XEaJ4qS/eQus+SZtQnsNAbHWFgRBEOqK2rwfF37xGp5RomobbV1MuLW0lnguagCFJYn3womwrXYlJoaiRYbUKIu22aoqhmKl1ml3K7xmSB1TXm6gnmVvUXwxpG4r024xNMDSEs/swOvT1wxp8fgUtFl23VrmxB1bOOGRoW4xxFCi16KqUUG0dD3tTel4x6chImIoQS45aTDfZp0eeDLnEU7tV32VLAQQLSQIgiDUFbV5Cgo3Q4haM6QRIeHW0lri9fcBKAyrA4oVaSoNMyNQzRLiRaA8UcahiiGtuCksdVNY6k5CaBnXDLVuFBBD+5NofJphs+jMAoxoFkMM+f1KsJ4rESHSPa8KkSGNMLGYzXRsFr1BayJuchA/MqRdiyOJ+qaGwuG3x1Wkcaadcyf+Bxy5sHclWRu/4cfbR0XMJ3VDyaO9I5FowzdBEARBqG+ERxPCLxnUp9o0uVgRFLV+JRYVHn8wMjNr1V763juDjxZuN5w3XKBs3V/G4AdnceO7S+Juxwij+pt3529j8IOzGP7w7ITWEdFnSJMmlywZNktcO+dYaXK7iyq4/6tA3Ve0FLVyjZ7UOtfFS89T0YqsDJslpvlCtDGEExRDUdalFVWHo6mViKFkyGwKR90YeDznP1iJ/BHShoKFxNCmyYmWFARBEGqT2rz4C6+RjRYZ0qbJxTInSCQyBCGr6snTVuDxKdzx6R+G84WLoWdnr6fE5eXblXsS2k44qktvdQhPE1SFYqtcYzGUZbfQtrGxcYHTZiHbEd2dDQKRodvH9jB8bcnWA8HHJ/U2zhDq30Shc7NMrjqms+6z9cqlQ6OOWYvFbOK647vQpXkWFx0VMPb6x8m9DOe1RjFQCCeeGBrbpxW9WuVw0fAOCa2voSFiKFlG3AjORpC/huwNX0W8XF7F7s2HM9qTg0TWBEEQhNqkNlO1w9OawsWQ+lQXGYqVJpfgOVO1lo6VAgYhMdSpWaDXTHmcZqrxyE3Ajjla6paKdv8VRaHEra8ZAhjasUnwsdNm4ftJxxuuy2Ezx02Ta5rlYOKJ3Xnmr4MiXlPrk47t3pxzhrQzXD7DCjNvPYa7T+ujmz68SzN+/+dJ9IiTOmcxm5h8Sm9+uH0Uuc7AWG8Y1ZX3ro40HUi05jpYMxTDQGHGrcfx0Jn9E1pfQ0PEULI4G8HIvwGQM/9xLITl14oYShrtd1nEkCAIglC71J2bXHiWmyqOShKNDCWQJgehupr2TUMRE6PaIbVm6IgOTSJeqwqJ9KbJzYidPqZNEyxz+4KCsbUmTS7cwtqolw4E6mHipck1zbJVriPyElkVQ/FMFmIRL5oTrRbJadB8NdFPbk6cyNDhjhyVqjD8eshoivXARk43/6Z7qTTBgkAhhLZYsCY6HAuCIAhCNJLJkotW15povWtkzVBkmpyiKHoDhVg1QwmmyamOco0yQhfxW/aXRsynirBB7RsntN54JCKGYjUthYAYVMJEosVs0gmS8PqhcKMKFYfVEnd7TbMCdT5G9Th7ilyV81RdDEUTaiqWKB9Io+ariV4xxYsMHe7IUakKjhw4+hYAbrFOw0roR0vEUPKYJE1OEARBqCO0l57+GOegjxZuZ8i/v2fZ9oO66V6fnwn/+5XLpi6Iu63wu/7h57ztheVc9vpCfc1QNdLkWlQW8Kt21m5Nl9cN+0oi5lfFRveW2WQaRCKSJRExlGGPLU6KK7wMfnAW05bsCPY9ynZYddcObRqFIkOxUsecNjNZcfZLFTo2gyiKGhmKl24Yi2hCTSVaZMjo/UhUhGdJZCgmclSqyrBr8Ge2oKN5H2dZfglOTtQqUgih/V0QMSQIQlV5/vnn6dSpE06nk+HDh7NgQfSLU4/HwwMPPEDXrl1xOp0MHDiQGTNm1OJohXRBeyNeKxbCuePTPygsdfP3j5bppu88WM7KnUX8tC5f1yzUiPAUKaNT3s/r8jlU7gk+j9lnKMZ4AfJyA2JIvTbR9uzZZ9CfR50vx2mjTRQTgmRonFDNkNZK2lgIHCjzMOmj5cHxOyub+Zw6oDWtGzk5c3Bb/nNWf7LsFp674Iio23JYLVgtZo7p1tywf8/gDo2Drm9GURT1mIU7zr1xxZFk2i08eW78mhttZGhEl2Zk2S2M6tkiOC3aMWiW7TCcnghDOzYlx2FlZLdmVV5HQ0bEUFWxZ+EdGYgO3Wz9DFtldEjEUPUQMSQIQlX48MMPmTRpEvfeey9Llixh4MCBjBs3jn379hnOf9ddd/HSSy/x3HPPsWrVKq6//nrOPPNMli5dWssjF+oakyY2FEsMBeePcIQLPTaKtmiJZ6CgUlwNA4Vrju0cfKxGZtT90qbcGV2vqDVD2U6rYTrZSb1a6uyi45FIZEhbmxMv/UzdDzXC8b8LjuDXf5xIrtPGX4d14I/7xnFUl+gX/GoPnbevGsZ3tx6ne+2P+8by6Q0jg++vUc3QniiRoVE9W7LivnFMGNA65vjD13v6oDb8cd84TujZMjgtmhiKl94Xi56tclh271huHNWtyutoyIgYqgbKkCvYpzSmnamA8yxzABFDVUF7LhAxJAhCVXjyySe55ppruOKKK+jTpw9TpkwhMzOTqVOnGs7/9ttv889//pPx48fTpUsXbrjhBsaPH88TTzxRyyMX6hpFU3kRqyGpSnjEQGtwsCE/jhiKUzOkUlwRigwla62tFSDqY0/lfrk0kaHisOsVv0KwoWi2w0qOgdFAttOaVKpVImJIKxDjpZ+p+6sKCpPJpBMP8RqhOivrbsKXA8h12nRC16i2p6JSmKp1RVoSacIK+s+A2RwYhznBfahO6mKi4zscqZLMfP7553nsscfYs2cPAwcO5LnnnmPYsGFR5z948CD/+te/mDZtGoWFhXTs2JGnn36a8ePHV3ng6YDVkcXz3tO53/YmN1k/5xPfcVIzVAW0P+VioCAIQrK43W4WL17M5MmTg9PMZjOjR49m3rx5hsu4XC6cTn3RdUZGBr/++mvU+V2uUApUUVEREEi383g8hsvEQl2mKssKIVJxHLWCoqzCjccR+2LfatFvr6TcHXy8dndRzLFoL0c9Hk/UG4CHyjRpch5f1HWWu90R0zJtofGrLmIVHi8ej0eXJldc7tYdP7c/dHPSYVZ069GuO9FGnwBZ9vjzag0DmsTpS1TuCuyvzWyq0ntuM0f/rIRPNynRhXGO3Xj7iXwetRpL8Ve+t1pXQL8/6vIdmmSwZm9IcCuK0iB/QxI5jqnc76TFkJqKMGXKFIYPH87TTz/NuHHjWLt2LS1btoyY3+12M2bMGFq2bMknn3xC27Zt2bp1K40bN07F+OsUswk+8J3AddavaGMq5K+WHymp6BN/QUGHVv/EKl4VBEEwoqCgAJ/PR16evgliXl4ea9asMVxm3LhxPPnkkxx33HF07dqV2bNnM23aNHw+47vwjzzyCPfff3/E9JkzZ5KZmVnlsc+aNavKywohqnIcP95kZleZieJyUGXKRS/+RI5N4dpefgOXucAlU+mhQ0yfPj04dUNR6LW3ft+GtXAzA5sZn8vy95pRk3L++swMiiuMhVfBoZLgmIrLKnTb07JRs22Vdav/BAIRhPxd2wAz6zZt5eRHt7GxOLRTazdtY/r0LcHnlRlymFH4YdZ3HMwPjVVl385tVJSZSNTUefG8XyPGF86B/fnB7VQcKojYppa5vy8ALJSVFEc9JiEit7t962amT99oOE/4+naXGa8DYMm8n1kXQ7fF+jwW7Asd1xV//IFz93JW7TOhvmcLFvxOofHPFja3/j0pKkrkONRfYh3HsrKylG0naTGkTUUAmDJlCt988w1Tp07lzjvvjJh/6tSpFBYWMnfuXGy2wCenU6dO1Rt1mmAymXBh53nvGTxkm8pN1i94pfzyuh5WvUObopBoAzlBEITq8Mwzz3DNNdfQq1cvTCYTXbt25YorroiaVjd58mQmTZoUfF5UVET79u0ZO3Ysubm5SW/f4/Ewa9YsxowZEzw3CslTneN4y90zI6ZtLw1c6PcedixdWmTp558XmD+vZTPGjx8anP7LhgL4c0nw+V5HW8aPH2C4zZklf7CscA8AiwuiX/S7sQCBaIFitjJ+/DjD+X7fVAh/LtJNG3fsMGbvW4HVYmZIv/b8sGs9m8ud5Jfoo0iNmuUxfnzAbMDj8fDmF4ELz0aZdk499QSWfLOG+fnbdMv07dWdnav2sae8OOrYVXq0zGbs6ME8sPTn4LTOzTLZvF9/EdumVR6d21v4ZsUe/nn2UZz7cnTjk0GDh8CaZTRr2pjx4yObkGpR3y8tfXp2Z/wJXQ3nCc9W2rq/jP8sj4wUN8m0cc6EMYaudYl8HmdpPgNHDBrE+IGtqVi6k/c3/gnAMSNHMrhDY8Nluw8tYcLz84IRxZycHMaPH2k4b30mkeOoRudTQVJiqCqpCF9++SUjRozgpptu4osvvqBFixZceOGF/OMf/8BiMc59rG/pCB/5RnGD9UvamQrot+sTPJ6G2cG3po6jX1Ow6nJX7T2uT0h6TPWRY5gaajsVoaZo3rw5FouFvXv36qbv3buXVq1aGS7TokULPv/8cyoqKti/fz9t2rThzjvvpEuXLobzOxwOHI7IOgGbzVYtMVPd5YUAqT6OJR4l6vocVovuNa9ff1Fc7vFHXdZuTazmo0JjmuDyRl8fBg08szPs/HrniZgw8e78rYBxQ/hSt0+33lJPYD+aZtmx2Ww0yoys38lx2oMmBEa0zHHw4+2jsJhNWM0miir0pQMXHdWRC4Z14IZ3l/DzunwA7DYL/7twMI95fHjCaqBsFpNumr8yKmIPew8SJcsZ/XMSPj0rw7h+ae6dJ+GIU7sT6/PosIUuve02KzabDbvBNCP6tG3CH/eOpe+93wUmmCLH3ZCIdRxTud9JiaGqpCJs2rSJH374gYsuuojp06ezYcMGbrzxRjweD/fee6/hMvUrHcGKByvPes/kUdsrHL/3bb77ahA+S9UtENOdVB/HHTtDYd85P/3E2qq/xfUKSY+pPnIMU0NtpSLUFHa7nSFDhjB79mzOOOMMAPx+P7Nnz2bixIkxl3U6nbRt2xaPx8Onn37KeeedVwsjFuqaeP1Ziiqi3wQINxAIb4paUhG9drgqRew+v4LX5zfsT2NkoGA1m3BUii51rEbGEOGGTyWVT5tVmgMYuZdl2C0x++TYreZgTxvt9rVjy3JYsWmOg9VsxmQykWm3Uh4m2hpn2skvDt0c96huclVsHupIUIzGmjejmv2XbAZW4mZTYgYKgO74Cqmhxo+o3++nZcuWvPzyy1gsFoYMGcLOnTt57LHHooqh+pSOoIZYp/mO5SbLF3Q07+OU5tvxj7g5pdtJB2rqOM7+eAUU7AZg5NHH0rt1TsrWnY5Iekz1kWOYGmo7FaEmmTRpEpdddhlDhw5l2LBhPP3005SWlgZTui+99FLatm3LI488AsD8+fPZuXMngwYNYufOndx33334/X7uuOOOutwNoZaI51xaVK4XQ1rxFB7dUcWQyRSogY3lKpuM+YCWCq+fbAMB4DGwAtdaN6uiwSgFPdzwqaRyl5tkBX4Lsg3c5DJslpj7EC5Swp+rQkp7wa8bb5h4apJp04kh1VrbyOktEWJFtaozbzJo3fPUw5CMI56QepISQ1VJRWjdujU2m02XEte7d2/27NmD2+3Gbo8MQ9bHdAQvVp7xnsWT9ilY5v0Py/BrwdEwL+pTfRxNWptJS9VC3/URSY+pPnIMU0NtpSLUJOeffz75+fncc8897Nmzh0GDBjFjxoxgJsO2bdswa1KKKioquOuuu9i0aRPZ2dmMHz+et99+u0GY+wjxCU/HCudAqb6+Rhv9Cb8QV62vm2U5KChxxRRDRnUmieDy+PhpbT6PfreGDk0zee2yI7FbzYaiLpa40KKOc+7GAv777Rr8pWqaXOzIkFH/HaNtB56bDJ9r5zOKlKg0DktV8wTFUNWEimqtnQhGYqhNI6fBnMmhbbyrRoQsSUSGhNST1KdJm4qgoqYijBgxwnCZo48+mg0bNuDX2AauW7eO1q1bGwqh+swX/qPZbm4L5YUwf0pdD6feoM1WEAMFQRCqysSJE9m6dSsul4v58+czfHiowHrOnDm88cYbwefHH388q1atoqKigoKCAt566y3atGlTB6MW6oJ4zVULy/SRIW36Vni0Q63vaZ4duKaJJYaS7R6hRmEKStx8sng7W/eX8cv6AlbvrqylNjhnaiMPsaIbamPXC1+Zz/Idh1hxIDCv2usnmhiKdNkz3jYEjKa0gkwVAtr5wpfR0ijMalvtl2SrYtQmmWiPUTrg/af3q9J2tdh0kaFKMaRLG0xcDEk3ktSQ9Kdp0qRJvPLKK7z55pusXr2aG264ISIVQWuwcMMNN1BYWMgtt9zCunXr+Oabb3j44Ye56aabUrcXaYIPC69azg88mfscVByq2wHVE3R9hkQMCYIgCDWMN54YKnXpnpd7ojc+VSNDzbMDEZVYNUPxapXC6dsmUBqwYV+JTsCpj31+gzQ5c2KRIZfXb1hL1CSWGLJZdI1JI7ZtICAcmmmq8LGE1QxFIydsDGpEr8o1Qwa9kxLl5/87gTF98uLPGAftMVKPg/Z4mGOpzTDkiik1JF0zlGwqQvv27fnuu++47bbbGDBgAG3btuWWW27hH//4R+r2Io340jOM+1v0gvw1MO8FOCEkDKMVQB7uaE8O0bpxC4IgCEKqiJcmVxiWJqcVQ+E37VyVkaGmlSLC7fPj8voMC/CTOcc5bWZ65OWwfMch1u8r1o1ZFTFG+6GNtNijuPaqGDWKD0aGDGqGMu2WmB2GjESK3WoGl/51rWCLVf/j1JgV2C3mFNQMJWd+YDaB+na3bZJRpW2Go70OVNMmzQmKQ6FmqJKBwsSJE6M69MyZMydi2ogRI/j999+rsql6R5FbQTn+TkyfXA6/vwDDr4PMpjzz/Xpe+nkjn990ND3yGmYtUVXR/pQbOeMIgiAIQioxMh7QEiGG3NHFUEVlZEgVQwClrmhiKPExZtgsdGuZDQQiQ9poliqGDN3ktGIoSmTIaTNT4fEbpvSp+5HjiKwXzLBZiJXFZbNGvqhLk1MNFHRpctEv/h1WfVRJ3d+q1wwlt5zVYg4e61SV8th0UaDAf23NUDJaKNlIo2CMyM8U4/MruHqcBnn9wFUE8/4HwFPfr6PM7eOR6avreIRpiOa7LJEhQRCEhonfr3D7x8t55edNSS+751AFV72xkF/WB3rTFFV4uPatRXy7ck+VxhK3ZihGZEitbV258xBXvL6A5dsPAoGoSWZlJOPfX6/ivi//jFhvMue4CDGkUVKqoUNV0+SyK4XO5a9HNjhVxZCRhbTTZomZxmUkUuzWyDQ5WxQ3uXC02ypz+3jq+3Vxl4lFspEhbf1OrPTApNapTZMzrBmSS/PaRo54DVDuUWBUID3ON+9FKN0ffE0u9SNRNEdFDBQEQRAaJpv3l/LJ4h0898P6pJf912crmL1mH5e8Frh4f+HHjcxctZebP/yjSmOJFxk6VB7dQEGNDJ35wm/8uDaf3zcVAgGhoNbZTFu6kzfmbmHr/lLdepK535dht9C+aaDx3p6iCl19jyrmjNLktOYC0WprshwBUbAxvzTitZY5gdqnRhmRkaFMAwMF7XwdmkY2CszQOLjZggYKmjS5KoRcEkmTu2FUVwB6tQpl44QbKEw8oRsAVx7d2XAdVbVCj4V27CYDMSRaqPaRzk0pxG4NhFPLPD7MHcayzd+J/t4tuH5+CjB22xP0Jwe/iCFBEIQGiXoxX+aObkYQjV2HKnTPww0OksXjjX2uCW+kWmYghsKFiMNqJtthZZ9Bk1CV8MjQz/93Asc99qPhGLQ21j6fortZ6A5GhoybrqrYDdLWQC9QtGTaLbSoFEN2q5kF/zyJa99ezLLK6FcgWqRfZ+tGTj6/6Wh2HypnaMemEetskhlKH1QjQ9oxVqWWOpHI0P+N7cnpg9pQVO7lvJfmAZHW2pPG9OC0ga3p3tK4fKGqEahYWA16CmkjYBIZqn3kiKcQNTxe5vLy/Zp9POk9FwDb4ldpjjjLRUN7bhA3OUEQhIaJWu/h9StxIzPxsFTzgjFempxqiqBSYZAmF47Dao4wHQhPrQpftEOzyEiKirbBqdevGNYMeYzS5HRNV41Fj1EKHARS5LRjbpnrDBoqADitxtbanZtnMbJrc8O0vKbZoeXVqIi2rqkqZgiJiBSz2USvVrnBazOIjAyp80Tr7VMTPX+0kTuj3bCIm1ytI2IohWTZAz+CZW4f367cw4/+QSz1d8PsLecG65d1PLr0RdLkBEEQGj7aC/eqRIe0VPeGfTwx5vL6dMXpejc542UdmjQ5lfD6mmQK3jPs1qBo8PmVMDe5wHiMDBQsusiQ8YGKFhlqmhWZGqc9L5vNpggjgXi71DRTK4YqDRQ0YrYqqWixLMPD0Qqn6tQMpQptTZcqPLWfi6R0vlwypQQRQylEvdNS6vayKb8EMPGU92wAzrf8iAN3jKUPX3RpcmKgIAiC0CDRXrhrIy35xS4mfbSMxVsPJLyuZFOJvlq+i8nT/mDytBV8tnRHXDHkV+DmD5axuSBQU6MVb9Fu2jlt5ggxdMcny5m7sSD4PKmaIZs5KGy8fj9ev75maOXOQzw5a13MdUQTDZnRIkMa4aISfl5Opg8O6F321PfNVu00ucTHoF19sn2GaqIdijYqZhQFkjS52keOeArJqvxxKXf7gnaVv/j7U57ZhmxTBSeYl9Xh6NIXnbW2RIYEQRAaJNo0L60hwV2fr2Dakp2c/eLcqMuGXzImm770t/eX8v6C7by/YBu3fbg8oTYOXy3fxdVvLgRCjVUhIA6MIjwOq4WsMDG0cMsBpvwUcs9L1k1OvTD2K+gMFDw+hTOe/y3uOozEUIemmRG1Myp/HdouYlp4+nqypmrNDNPkEuszdFLvlobTk6nlyct1Bh8n26zVWsV+RrHXqekzZHAwE9FCwzoHarP+Oqx9ysZ1OCNiKIWEIkO+4F0kBTNbW40D4DTLvDobWzpTEwYKbq9fd7IVBEEQ6hbtzS5tpGVLQVnS66puLYdqkJBpt/DcBUdw0fAOhvOpbms+jXjy+hSKKiL78zisZsMLe21j03hiqGuLrODjDLtVt58Vmjoml9ef0M3D8Iv/d64azpcTjzZMk7uht89QfIRvxxQmTZU4uVp6A4VKN7kErbVHdm3O1MuHRkxPRgzlOG3Muu045tw+StfcNBFqJk0utnNcIpGhN644kg+uPYqrjumSyqEdtogYSiHBmiGXl1J36MdvTfOxAJxkXorTn/yPfsMn9EP664aCGPMlzohHZtPn3hm6VAxBEASh7tCmeWlrcKoibLTLVOUe2sGyQNp6/7aNmDCwDS1znIbzqQX3WkHg8ysRfYgC81oML9K1wi/eWAe1bxJ8rDVQAP0xc3sTM6AIF2fHdG9O40y7YZpcz0bGg4u4SZlkzVAzXZpcpIFCvFS0IztFOtQlG+HpnpdDp+ZZ8WcMo7pGHUbY4kWGEvg6ZNqtHNWlWY0YPByOiBhKIWpkaH+pW/fjsMXWlc3+PDJMbgaV/15Ho0tftMfqk8U7+GPHwWquTwm+B1v2R/ZQEARBEGofT5SaoaqkImlFQjxdYCQc9hQFrLrVNDJbFAtqVQxpU8W8fsXQ2ttpMxuKIe2+atPrjFLYtOIlw26OerGbqBjSOsNp1+U0EEPR0t981a0Zyo40UNBFhuJc0BtFSmoifc2IqjjdxUNXM1S579ojnKrmrkLiiBhKIWpkKL9Y/yNZVOHjK3+gz9DwUuN+Aocz4TeV1ILVKq9Ps8LwcL4gCIJQN2jrdLTRklh3t39Ys5cnZq6NmK69IP9os5mXft7M279v1c3z0k8bufn9pfywZl/E8nuLAudp9eI8WqRBvcmpjQz5FYX9JcaRISOBUx4lMhRu86wdDwTu/kdL05r622bD6bHQmjtEc5MzIqJmKMntatPkVF2jjQbFiwwZCZ+a6P9juO0aaboaOzIk1D7SdDWFqD+a4WLoYJmbX3wjudn6Of3LF7F2yzYmTtvM7eN6Mq5vq7oYaloRXoiqdZ6pCuJIJwiCkH5ETZOLcUF45RuL4q53Yb6ZhbPWA3DmEW3JdljZc6iCR75dE3h9S2HEMnsrI0Pqnf9oF9eq0YDWTtvrUzhU7omY1x6lZqjMbVwz9NcjI4vftRf+TpslpWlQWjEUzU3OiPH9W/PHjkN0rkwzC3+7ThvQJubyWjGUWXnTWN90Vb/CU/q14tuVezh9UJuIeVVqTwzVbNNV9WGHptH7TQk1j4ihFJLlCPy4TF+5Wzd9f6mb9Uo71vjb08u8nS8+eJn1B0dw3duL2fKfU+tiqGlFuHSpbuNVMaQTBEFIP3RpcppoSbJF7aAXVlpcHh/ZDislrpBYUYUPQK7TSlGFlz2HVDFk1v0Px2mNjAyF9/xRsVlMUdLkQmNVtdCYPnncPq6nwTpCy2fYLJhMJqxmU0qcVqsaGbrqmM50bp7F0I6BeiZtNGPKxUOiOr6p2K1mvv7bMbh9/uAYdE1XwwTH4+cO5PRBbTiuRwvAOG3MHiWtMdXURE2ONhKmrr9N4ww+um4EjTIi+zylHJ8HyvZDaT64SiC3NeS2A8vhKwkO3z2vAdQ7HuGBCbXQ8mvfUfQyb+dY18+8wIjaHl7aEn68qhvY0TrbSARaEAQhPdBaa2ujJVVJRYomDlSXOK0AUWft0jyLQe0bM23pTvYVV9YMBcWQ8RicNqOaIb9hnyKbxbhmyO3z4/X5sVrMwcjQ+P6tDBuAao+FGr2xpEoMOUOXfNGstY2wWcy6LBbtefXkfollt/Rr20j3XBtxCY8MZTmsnNyvddwxUVEErmLIbAY2YwOM6lITtUnaz5pWWKp22Unj90FZYUDclBUE/pcWVP6p0zTPKw5GrsNkgUbtoElHaNwx8L9J59DjrBYN+oJKxFAKiRZ23l8SSJv72n8Ut/MxRyoraEoRheRGXVeFx8d3f+7h2O4tqp02lu6kOjIkWXKCIAjph/aCvlwjVqpy9z1anyDVrEDbF0gly2ENnk8LKmt+gjVDUZqTOmxGNUMYiiGrxRS19qjc4yPHYg6en6LVimijBqpgsZpNRNo1JI8+Ta7ql3+pqMVN1Fobvw8ObWeUeRldTLvpYtpFV9NuhkwrgHJNLZg9OyCKsppDZvPK/5XPs1pUTmsWes2emLNcTaTj6WqGEv3se8qhcBMUrIf966FgQ+D/gS0BIRTH3jwCk7lSRGZC8W7wueHg1sCf4aAzoXEHaNIpJJCCoqkTOHKS236aIWIohYSLITW0XVAZGdqitGaTrTtdPOs5xbKAd32jo67r6e/XM+WnjfTMy+G7246r0XHXNeE1Q9Wt+dEu33DvYwiCINQv9E1X40eGjBqbGq1LixoZcnkiX892WGkSdnNRdZGLWzPk00eG3EZiyGxcMwQwa9VeSlze4PkpmmOYXecmF4oMpQJdmpy96hf5qQgQRDRdrSgKXeQXrKt8vB72bwSfizfC7wmXV/43W8HvBXdJ4C/axXzEADIqhVJzyGoJ2S0q/+dpHrckRykmIDRSdzWh/Yzo6uX8fijeVbnfG/TC59B2YgseE2Q0CQg/db8ym+ufB0VhC8hoDGaLZru7A8fuwNaw/1ugaBd4yiB/TeAvnGHXwfhHU3Bk6g4RQykk/He7XZMMtuwv01lg/uo4ji6e9UywzIsphqavCNQdrd1bXCNjTWeqmw2gXb4BR3UFQRDqFfrIUHw3OVcM++h4aXJGy2Y7rbqeNxC/ZijDZtBnyKfg8UapGYoSYZr00XLd82j6xqpzk7NETItGj7xs1u0tiTnPcT2aBx+Hp8m1ynUAkY1kjRjWqSmfLN6R0LxA4OKo/EDgorpoFxTvotvm9fzXupIOpn30fq8AyiId/4JY7Kz1tGSj0oZNSms2+Vtz4znj6dZ7IDgbQcWhyhqYglBKmDY1LDitch6fC7zlAYFxaHvMoT8DPOawUEAjeOlRyG6pF08ZTQAlsI+KH5PXQ8eCPzAv2RewzlP8lReHSuVjP01LXFxjWY8JhZy5i6BkS0D07N8YEB3RcDaCZt2heXdo1q3yr2tAwGU0rXrNj9kMjdoG/jqOjHzd64JDOwLCSBVK2seNjRsW1ydEDKWQ8LB55+ZZbNmv/2D/ZDuGS3mNYaY1tORA1HXVhLd9uhIuIlMZGRIEQRDSA63pQEJiyCC6oxItTc5VuV6jhts5mjQ5lWDfm6g1QwZucn4les1Qgu5jUdPkNMdCNTlIJDJ09uB2NMmyM9yg7uSHvx/P4q0HOHtwu4h1A1x8VAeuPaYTS3/7IaGxnzOkHWaziSEdmwTS2ErzQ0KnaBcU7QxEGtTHRbsD4kNDZ6CzegWqXiZl51Ve7HeD5j1Cjxt3ZNw/Z+iWv7bNEZBRWWqQ0Tjw16xr/MErSqDOqKwASitNBEr3QYn6f6/mcT64DmE3+WhDIeyOdCUMxwoMAoihsZoC/1J9EuaHvWi2Bmp1mncP7E9Q/HQPRHfq4g6v1VE5lijHN4qZSX1CxFAKOeOItsxctZdf1hcA4FOgRY5DZ7W9U2nOMnoyyLSWUy2/AxcbrstuUFjZUFHCQr/VFTOK7nt5+IhKQRCEdEZvoKBpuqoREIqiBFPIjOp+guuKEhmqiBEZyjIUQ4FtRav1MXKT8yvGYshqMUVt3hpONH1jM6gZiteUVB3feUMjrboBurTIpkuLbN00bc3Q5SM707qRg6XRVq4ogahKwTooWIe5YD3nFKyHX9cFIiv+xCJKZDaD3DaQ04Y9NOWdVV52Kc34+0UTaNu1fyDykSBVtrw2mcCZG/hr2iX+/J6KgGAq2VcpkPbpxVPFIcAUqMExBQwy9ubnk5fXGrPFonsNU+BxuUdh+p97UDBz2uDOOFt2CwmeJh3BUguOcqmkBuzHaxsRQykkx2nj7auG0+nObwAoqfDQvkmGTgy5fX6+Mx3NIGUtEyzzoq7LfhhHhqpvrS2RIUEQhHTDo/ltr4gSGfL6laBAiZ0mF91aO7BspJDKdkaPDEVLk1PFjd5NTjGsGbKZjd3kjIhWM6SNUAXd5BK4HjCKhMVCGxlSa5NMijdQq3Jwc6XwWR+q3ymPnsmCyQzZrSotmttAblvIaR34n9umUgC11jm+bd9SyP9WBK6Bbms9GJzJ9dmpiWaohtic0Lh94C8BfB4PC6ZPZ/z48ZhtxqKmuKiCvy+bDcBJY8fgbOAmWfUBEUPVpG3jDHYeLKdHXnbEayUuL71b57Jk28HgNI/PzyyO4v+U1xls3hDIt2zSMWLZ2moolg6k2lpbZ6Bw+GhKQRCEtEZvoKCNDIV+qN1ef/D8FzMyFC1NLlbNUIw0uWip6erpxBdeMxQmhsymgDNYwmIoynRtml1G0E0u/jq1xzMRHLgYZ17AQPMmWnz9NtYDGzht/ybMy6KtxxQQBM17VKawVaayNe0cEEJJ1qto3/NoTn6x8NXjm55aBzm5eZseiBiqJu9dM5ypv27m6mMjw63d83Jo30R/t8Pt9VNEE37392akZRX8+Rkcc2vEslX5caivhKfJpbLpqvzOCIIgpAfa3/ayKE1X3V4/WY7A44ooNUOKokSPDAX7DBnUDDmt5DptWMym4FjscSJD6ojDI0PhYkw1OYiWbhdOtJohbZpdMm5yPfISsDb2eWDTHFjxCS3XfM1L9krDhQ2BfyZAsWViUoVO8x6B9K3m3aFpV7AnF72Jha7PUBWiPDmO+nv5qnUediTR70moOervpylN6Ngsi/tP76eb9s3Nx/De/G3cOroHP6zZq3tNLSD9yj8iIIZWfmoohg7nyFC1a4Y0y8eyZhUEQRBqD62BglasaH+mteln0SJDPgMxEr7eaNbaZrOJJpl2Cir7/wVrhqLcgFTHpnOTUyLT5NS6nkTP3dGCPapIMJnAUTmmeGLhrlN7c/aQdsYv+v2wbR6s/AT+/BzKAyYAJqA8sw35rY6jQ8/BeBt3YfYf2znx9Iuw2R0J7UOqSMQtT8szfx1Ey9yaabJaG2TarUy5eDCKorc7F+oOeRdqgL5tGvHQmf0BaJ6t/1Fxe/2YTTDDdyQPWN/AtuePQF5u8+66+Q4rMRT2vPpuctHXLQiCINQN2miO1k1O+5uvbUURzU3O61ciDBRO69+Kr1fsiZkml1V54dk0yxYSQ9bYkSH1LKJLk/MrOmGnX09iUY5oNUPq8hk2S3AebWRI7V+oJSIzRVFg9zJY8Ukg+6RoZ+i1rBbQ5wzofw4Z7YbRoVJ8KR4PFWumB+p/agFtRkgy7rkOq5nTB7WtiSHVKif3a13XQxA0iBiqYcIbvLl9fpxWMwfI5Td/P0ZZlsPKaTDqH7r5HJq7VF6fP+k7J/WKiMhQ9VanPbFKPq4gCEJ6oBUQ2jQ5rdDQipiKKJGhgBjSix2HTV9nFM1aG9DVDSVaM6Tdns+v4A4bmxrRidZnKJzo1tqB5bUGB+G9h4oqori35a8LRIBWfAKFG0PTHbnQewL0Oxs6H1/1fjQ1RDLOcKlqQCsIWtLrG9EAaZqpF0Menx9H5Q/bV74RlWLoUzj+Dl21v/aHudzjI6cBi6FUW2v7dWly1VqVIAiCUE0OlXn4eX0+Ja7QRbxWrPiSjAwFDAz0P+7qDUSXx8/Og+V8vmxnxHLZzsAlT7OsUMaGPU6tj3o+Ca9lDa9nimfRHY7ZBBzcBkW7GGDaiBsbHixkl+fRiv00t2UHbJstduym0LYywsRQGwrgt2dgxcewZ0VoA1Yn9DgZ+p8D3cbonNzSAe25OZnIUDQRKQjVQcRQDRMeGVIU8FTeYZrpHwoWOxSshX2rIK9vcD7tF77c7SPHWc9855NA/VE0mQKP/dUMDWl/ZEUMCYIg1C3Pz9nAyz9v0k3Tup9pf/M9upqhaGlyfp04ybUpwX5ALq+fcU/9rBNeKmp9RsvckBhSi9mjGigY1AxBZORJtcROJMXdjofOyx6HVS+D4udLbTb9V/C7E6gA/hOY9DHgc5hwY8PntlHhsODBig8z7UwFMKtyWbMVup4I/c6BXuPBkYCpQh3RODN0TRMtZdAI0UJCTSBiqIbJdUYeYvXOVzGZ0H0srPk6EB3SiCFvFNedhoi6p1azCY9PkTQ5QRCEBsS+ooqIaWUeX7DBqlbYJG6gEJiva4ssLmx3iILKyFCFx2cohCAkhq48ujMVHj+5TivH9WgB6NPbbhvdg6e+XwcYu8mp29GiWmLHi3IMMG3kcdsU2v1ZGblq3AGvz0dFRTmZZj8mvwe/14VF0e+DxaSQgRtwk63ZhF8xYe50NPQ/O1ALlNk05vbThY7NsrhvQp+IG8bxkDQ5oSYQMVTDGN3x0BX49z0TkyqGTrw7eNtD+8NbbpD7XOb2YjaZgh2q6zOq41sgGqak1FpbEARBqFuMLLIVJRDFcdosejGkrRlKwEDhn6f0pGT9AooqxczuQ+VRx6GmybVvmskjZ/XXvWYLa3b6j5N78d8Za0KRobC0vPDzcrzmrXY83GydxvWWr7Ca/LidzbCf/gz0noAV0HYqtEDgAPnc4HNzw5u/s2jTXux4Gdkph8fO7M1lr/5KcUkp25UWLLzi4qj7nM5cfnTnpJeRNDmhJhAxVMd4uo7DbsuEA1tg11JoOxjQF2uGR4ZcXh997vkOp83MqvtP1vVoqI+opxj1jk8qa4YkMiQIglC3RIvwVHh8ATEUrWYoAWtt1XZaNVBYubPIcBmzSW9KEI622amCgnpaVQzc5AJj1wu1WGlyfU2becI2hV7m7QB86RtB2788x5De3SPmDWIygdUBVgcVtkbk4wagwNEC8vqwwbKHnUp04ddQETEk1AQNtyq/nuCxZASKHCEQHapEexcqvLP0roOBlIMKjz+i10F9RD0PpkoMKWKgIAiCUGccKvfw24aCYC1QtNof9UafVmj8tC4/+Bsey1pbrb1VRYhaM7TzoLFAyHZYY9amaG8q+hVNbYqBmxwY1AwF+wxpjJDwcpv1Y76w300v83YKlFyud9/KzZ6/4c9sFnUs4Vg0Qk0VW0kYsDUo6vm9XyFNOUy/TumD16cE7C4h0A+g8gfXGydNLrh8A8gJi4wMVXN90mdIEAShzjh3ylwuenU+7y/cBkQXQ+q5TXsD7I25W/h1Q0HM5XwaAwXVltkRxdJanZ5Mc0tFARP6m3PhkaGI83KlelJrj/qatvCl/S5usX6G1eTna99wxroeZYZ/GJDcRb1OYFWKod6tchNfQQOiV+vDc7+FmkXEUB3j9vmh2+hAH4CinbBjAaD/4S1zR+kpAMEi0nqNok93SGXNkKTJCYIg1C7r9pYA8MXSXYBxzx8IZT2E/+b/tmF/zOU8PoM0uShiKDcj4FqWbWBmFA0FJRgZUkcWz01OlSt2vNxq/YTP7XfT27yN/UoON7pvZqLnFgoJXcgn46Cma7paKYweOrM/5w9tzxc3HZ3weuozX//tGM4f2p7HzxlQ10MRGiAihmqBVy8dSuNMG8dXutZo8fj8Af//XqcGJlSmymntRcPT5LRpYA0iTa7yv5oLrKSwZki0kCAIQt0SLzIULoZa5jhiLufTNF1VhYJdI4bOH9o++LiRKoaSjAyFPw4fY3ifI5MJ2LMCxxtjuNU6DZvJx3TfMMa6HmW6/6iIbSRT+2LViqHKSFiLHAf/PWcAA9s3Tng99Zl+bRvx33MG0DI3vfolCQ0DEUO1wOg+eSy9ewxvXjmMHnnZuteCokeTKqf4PDHd5LR3qMIdbuoj6snGmqI0OX00qP4fH0EQhPpMNCOEaJEhVehEW86rMVBQU8i0zqrDOofspYNiKMlefWrkJlpkSIsVL+eVvg8vj8K0ZwWFSjZ/c0/kRs8t7KeR4TLJpMnpa4akaEYQUo24ydUS6g+rPSyUHxRDXUZBRhMozee+515m0Z5OwXnCxZA2auRpEJGhSmvtFKXJKbo0uWqtShAEQagm0YwQgpGhsN/pkgovPr/CL+sLDJfz+f3Bc58aKdE2btWKIfUmW7bDwElu1zKoOAj2bLBn05r9lOJE8XkxVzZjVTMVojUD72naxuO2KfQv3RKY0Os0xi47lYIoIkilypEhEUOCkHJEDNUydku4GFKt1GzQ+y+w5E16FswCrgnN4w27a6Y5c4SH6usj4ZEhSZMTBEFoAFRet4fX15hNgRtVamQoXGgUu7x8tGg7uw9FNmuFwDlQvWlmsURmFLRrkhF8nFNZK5Tj0ESGDmyFGXfC2um69c5TM7B+Ba/ZyWkOO2zOhheb8YrPwyGbg1IyKFGclJKBDS9/tfyA3eSjxJRN9plPQ/9zKFimX6/hoUkmMmSJTJMTBCF1iBiqZaJGhiCQKrfkTU6xLORe7xV4Kt+e8OiP1uIz3O6zPqIKlmBkqNpiSPtY1JAgCEJdEl77k+O0cajcE7VmqKTCy9b9ZVHX5/MreCqXsVWeN0b1bM4Zg9pwVJdmmEwm7jq1N5sKSrnm2C6YTSYuGN4BvG6Y9z/46VHwloPZCs26g7sE3CX4K4oxKwHDIqu/ghamCvAUwd5dDIbKbqiRzPQN4eNWk3hlwGkJHxMTVYsMZRlFuARBqBYihmoZu1X/Q6YKHZfXxyJvL4ZlNKdJeQFHm1cwx3+Ebp7QMprIkLf+X+yre1ATNUOihQRBEOoORVEMxJA1IIbCaobG9c3juz/3UuLyBt3fjuzUhIVbDuiW9/o1kaFgfx8zT//1iOA8Vx/bJfj45UuHwuZfYMrfoWBtYGLHY+DUJ6Blr+B8ZgCvC1wlTPt9NS9/v4KTumTyfye05ZY3f8HuLyOLisCfqYIMXCzw9+Jb/zCGWRLvGwTJ9QnSRoOyHcnVPgmCEB8RQ7VMeJrcT+sK2F/i5se1+by/YBvP5B7F6XzNBMvvQTEU7hinqxlqEJGhypqhyryBaLnZya4PQvVIgiAIQu1j5HiqOruFaoYCv9O5lSYHJS4vFZV1RkYucF5tnyFLHFVRsg9m3gV/fBh4ntUCxv4bBpxvnKtmdYDVQWlmO9Yoh+jkbAXdhjDd78bjU7BbzbiNXO6SLOVJqmZIkyaXjEW4IAiJId+qWia8F8Kzs9frnr9VPITTHV8z1rwIB25c2CN+eHU1Q1GsR+sTqnYJNV1NXZqcRIYEQRBqhj2HKmiSZcNhjZ66VWFgnqD2/gmvGVKd30pc3qCTnJELnHadtmi2bH4fLJoKsx8E1yHABEOvhJPuDpgVxSHkJhcYm+om57AYi6Fk3OGSnV/bZ8jQCEIQhGohlXi1THjNUDhLlO7sVJqRYypnlHk5YJQmp60Zqv9X++rJJtR0tXrr00aWRAwJgiCkng37ijnqkdmc+fzcmPMZ2WPnOo0jQ40zK8VQhTeYWmcUGdIaMliMVMXOJfDqSTD99oAQaj0IrpkNpz2ZkBCCUNBIUQLnFPVc4rAZn8OTqQEKrL9qNUOSJicIqUfEUC0TniYXjoKZr32BBm0TLPOASMc4rQBqEE1XwwwUUhkZEgMFQRCE1DN9xR4AVu0u0k3XuYEqxrbaOZXRnrKwmiFdZKhyuRyDtDBtZEiXJld+EL65HV45EXYtBUcunPIYXPMDtB2S1P6p4sav6M+5mXbjhBqttvn3Gf3irj+ZNDl9ZEgSegQh1YgYqmWMIkPhN7a+8o0A4ETzUjKoiFkz1CCarlb+T5W1tr5mSBAEQUg1mfZQupb2Nzf8fBUrMqRGeNRovpo+F4gMVabJGVz8a9dpNZtAUTCt/Bj+dyQsfAVQoP+5MHERDL8WzMmnloW0iqJzu9OOR3tzU6ttLj6qI/ec1ifm+pNJk9NGhozEoSAI1aNKYuj555+nU6dOOJ1Ohg8fzoIFC6LO+8Ybb2AymXR/Tqcz6vwNnSaZkSHu9k0zdc9XKp3Z4s8j0+RitHkJbq8fr8/PKz9vYt3eYp0A8jaIyJDeQCGV1trVFVaCIAhCJFpRoEZ4gIh6GqOaITUypNYMecPFkNsbFErGaXKBdZpMYClcz8gN/8H6xQ1Qui9glX3pl3D2q5CTV+X9U+WHouhbWGjFiC1GA1TD9D0NyUWGQpdqWRIZEoSUk7QY+vDDD5k0aRL33nsvS5YsYeDAgYwbN459+/ZFXSY3N5fdu3cH/7Zu3VqtQddnrj6uC4M7NNZNa5wRLpBMfOUPRIcmWObh8fl5dvZ6Hpq+mrNemKv7YW4QaXKV/60GzfOqglhrC4Ig1CxmzcV+Yakbt9dPmdsbIYbCbbUhJCjK1MiQok+TUxQ4UOYBjN3TKjw+bHi5w/oR1leOp0XJahSrE068G274DbocX+39C9YMoe+DpBNDmkyPcHETTwwlgzYTUNLkBCH1JC2GnnzySa655hquuOIK+vTpw5QpU8jMzGTq1KlRlzGZTLRq1Sr4l5dX9bs19Z1cp41pNx6tm2ZkDaqmyh1vXo7VU8xXf+wGArnUbl1kqAFc7as1Qymy1vaLtbYgCEKNohU5+0vdjH7yJ45/bA6lrlCUyOP3G6bJqZGhirCaoWyHNSgiCkpcgXkNLv6tZbv5wP4gN1g+x+T3sCd3IN7rfoPjbg9YY6eAoJucouhqhrSRGWuMZkFxI0NJiCWtwJQ0OUFIPUl9q9xuN4sXL2by5MnBaWazmdGjRzNv3ryoy5WUlNCxY0f8fj+DBw/m4Ycfpm/fvlHnd7lcuFyu4POiokCBpsfjwePxJDPk4HLa/+mG0W/iOqU96/xt6WHeycCSX/n54LDga+Wu0H5UuCOPicvjw2FLvf1mTR1HfzBNLvDc6/NXaxserzf42O3xpt37nu6fx/qAHMPUkMhxlGMsGOHSOLqt21vMtsIyALbsLw1Od3v9UQwUwtzkNA1UM20Wil1eDlZGhppk2XXLDjOt5vIVz5NjLqSILDLP/h/zN5oZ37hjCvdOkyYXPj5NrZT2cbg7nFYM3XJSd777cw9F5R52HaoAkqsZKtcc6/D2HIIgVJ+kxFBBQQE+ny8ispOXl8eaNWsMl+nZsydTp05lwIABHDp0iMcff5yRI0fy559/0q5dO8NlHnnkEe6///6I6TNnziQzM9NgicSYNWtWlZdNNU0dFgpdJgY09XOwcD9GQbqvfCP4u/kTBh/6Hrd3aHD6b0tXB+df9scKtq9dwaICE32bKJhM8MY6C3/t4mNEXs1ERVJ9HEtKLYCJ/fn7ADPbtm9n+vSqp1L+ecAEBE5SixYtxrUpPaND6fR5rK/IMUwNsY5jWVlZLY5EqC9oI0PzNxUGH2ujGG5vtMhQZZqcO3DjSg28WEwmnPaAGFLJCrq3KVxhmcG/rO9i9fpZ7W/Pf3Pv5pVeE2DT9FTtVhBV3Gjd5CxmE07NjUZtylq4trFoxNGFwztw25genPfSPI0YSlwNlbtDxzQZS25BEBKjxuOtI0aMYMSIEcHnI0eOpHfv3rz00ks8+OCDhstMnjyZSZMmBZ8XFRXRvn17xo4dS25ubtJj8Hg8zJo1izFjxmCzpYdHf9+jyvhi2S4uG9GRt+ZtY/2PGyPm+do/gr/zCcNZSROKOEBg3025LWFPAQA9evfh6z/2sLzgEIsKQst+sMnCg1eMTemYa+o4PrH2F6gop3WrVqw8sI82bdoyfnz/Kq/PsWYfrFkGwJAhQxjdu2WKRpoa0vHzWN+QY5gaEjmOamReELRoI0MLtuwPPi7RCBm3z29YM6QaJahGCGodbHjkBQJ9fZrY3NzLy5xhCfQ0+tF+PDcWXcag3LYp2ptIQgYKCj5fqBeednzaeqZwjaKNDKmPta5wyWgabWRIEITUk5QYat68ORaLhb179+qm7927l1atWiW0DpvNxhFHHMGGDRuizuNwOHA4IvN+bTZbtS58qrt8KumW14i/j2sEwI0ndmfrgXK+WLZLN89mpTUr/J3ob97CyZaFvO87CYBtB8qD8yiYdE4+WmpqX1N/HANnBbUYVTGZqrV+s8ZG1WS2pM17Hk46fR7rK3IMU0Os4yjHVzBCK3K2F4bOSdqoTrQ0OTWiUh601g5MN5tNZISleGeVbuMj6z10V7bhVcw85L2Ib6ynU46bptn6FLpUohUrqsOpJWx8OTEiQ9rl1SiRViAlExlyiRgShBolqeRTu93OkCFDmD17dnCa3+9n9uzZuuhPLHw+HytWrKB169bJjbQB47RZmDSmh+FrX1caKZxuCXX53ro/lLbi8Sn13lFONTkwa9ISqoN++fRMkRMEIfUk0/YB4Omnn6Znz55kZGTQvn17brvtNioqKmpptPUbo4gPBHoEqbi9firC0uRslpCgUNPkgmLDZCJDE3kZZV5K6w9PobuyjXylERe6/8XrvlPYV+IGoGlmzYkhc9BAAXyVas0alianM1OI0VDdUumUqk1xS0YMyVlMEGqWpCvxJk2axCuvvMKbb77J6tWrueGGGygtLeWKK64A4NJLL9UZLDzwwAPMnDmTTZs2sWTJEi6++GK2bt3K1Vdfnbq9aAA4oxgefOUbgVcxc5R5NSealwB6m0+Pzx9hZVrfUM3f1BQCfwqbrlZXWAmCUD9Itu3De++9x5133sm9997L6tWree211/jwww/55z//Wcsjr58Y1QIBlGgMfty+yMiQ1WwOCp4Kjx+/P9TU1GyGDJsFE35usXzKVNvjmF2HWGfrxWmuh1ig9Natq2lWzUeGFBRNzZCZTHtIAGU7rdx1am9aN3Jy16m9jVYDhM5tWvmTjIHCbaN70LqRk3+O75X4QoIgJEzSNUPnn38++fn53HPPPezZs4dBgwYxY8aMoKnCtm3bMGvsJg8cOMA111zDnj17aNKkCUOGDGHu3Ln06RO7O/PhRjSHmF0051XfeK63fs0Dtjf43dWHMkJNa70+pcGIIdVqtPrW2pHrFgShYaNt+wAwZcoUvvnmG6ZOncqdd94ZMf/cuXM5+uijufDCCwHo1KkTF1xwAfPnz6/VcddXjJqpQmRkKFw0WS36uhttPYzVbKapuZxXbE8w2rIUAO/gq3ii8Bz2rjkQsa1mNZgmp6IooRYWVrOJDHvoXJ3jsHL1sV246pjOEcYG2nOPmh6nnSUZI4QOzTKZe+eJYp4gCDVElQwUJk6cyMSJEw1fmzNnju75U089xVNPPVWVzRxWRIsMATzjPYvx5vl0MOczyfox//ZeEnzNE6VAtT6SqsiQ9BkShMOLqrR9GDlyJO+88w4LFixg2LBhbNq0ienTp3PJJZcYzn+4tXyIR7nbazi9qNwdfOz2+Sl16ffPajZhUULnrAMloXoj054V3LvnRlpYduFSbPzLeyUPjfs3mZ+tNNxWrsNScy0ffKrttx+XO7BuixlsGj2SYTNH3a7XFxJ5is+HR/HrFJLP6yGd3vr6/nlMF+Q4pobabvsg3bvShFi9A8pxcpf3St6y/5crLDP4wnc0K5QuQGXNUD0XQ4qmOBWguiVQfkmTE4TDiqq0fbjwwgspKCjgmGOOCTTW9Hq5/vrro6bJHQ4tH5Jh+y4zRpn2G7buDE5XFFi1dqNuPp/HzYwZ32IzWfAoJqbP+gGwMsE8l5x3XsaquNmhNOc6922soRPHzviWwj3G21q/cimm7YEf+VQfx2UFgRYN+/cX8stvvwFWXOXlrFy+BLV1w7aNa5leZvz5WpYfavEw49tvMZmgID+0H7NmzcKZ+naA1aa+fh7TDTmOqaG22j6IGEoT4oW/f/YP5Ef7KE5wz+E/tlf4i/vf+LDg9vkagIFCAFUMKdWuGdI+FjUkCEIkc+bM4eGHH+aFF15g+PDhbNiwgVtuuYUHH3yQu+++O2L+w6HlQzJ8uHcRHCiMmJ7dpLluetPW7WBPyCk1KzOD8eOP477lP3KgzMOQI4dx18rbuNr6LSiwIftIzim4moPkkO2wMn78ODb+sJGf9kS2nzjlhGPo0sxZM8dxxR7eXP8HTZo2ZdjwbrByIbk5WRw3si9TVi8E4MgjBjB+sLG9t2fZLt7ZEIhonXrqeAC+PLCUlQfyATh53Fhd/VFdU98/j+mCHMfUUNttH9LnmyjE5ZvWExm0ZRF9zVu50vItr/hOo8xV/y03Vb2i2o/6UpkmJ1pIEBo8VWn7cPfdd3PJJZcEzXz69+9PaWkp1157Lf/61790ta9weLR8SAa3z/jHNbzVQ6kr3E3OjM1mI8NmwUIB3b67jCHWQJ2Wd+RtfOI9h4M/B5puO22BeS87ujPvLNhO1xZZLNwSqh1q1ywbW2XeWqqPo80WuDwyYQo4OxBwjMvJCH0GGmc6om7TYg2FfdR5tJ8ph92OLUZ6fF1RXz+P6YYcx9RQW20fknaTE+oOe+NW/Nd/MQCTrJ/QzrSP0ih520b845M/+OvL83RudOmAWtdjqTxRpNJaW2qGBKHhU5W2D2VlZRGCx2IJXJxKRDk+Ua21XfpzUnGF/rm10ma6l2UnXzn+RaN98ylWMrjOfRvKSffgtIdMERyVgqJZtoMF/zyJVy4dGnwt12mlcQ1aawebrhJyu7NonPBA33Q1mXVCck1XBUGoWUQM1SOcVgu/ZI5lnq8PGSY3/7a+TpkrMTGkKAofLtrO75sK+XPXoRoeaXIEI0OVn8bqu8lJZEgQDjeSbfswYcIEXnzxRT744AM2b97MrFmzuPvuu5kwYUJQFAnRiW6tHSaGwgwUbGYzFG7msfJ7aW0qpCi7C2e4H+A7/5GBPkOaaInDFrpEsVrM5DpDd4KbZUdG6VKJKlb8CkFr7YCbnEYMOaKLIaNzj1YAJdNnSBCEmkXS5OoRTpuZZjkO/ll0FTPMdzLKspzFRbP5hUFxl9XaoNpjmDXUBaGaITUyJH2GBEFIjmTbPtx1112YTCbuuusudu7cSYsWLZgwYQIPPfRQXe1CvSIRa22AonL985amQnj7bzRTClnjb8+yI99g47c7MJkC7RW0ttsOq16UmjXNeWqyx1CAUA2rzxcy+dGKtWRrfkya2JCIIUFIH9LrqliIwKL58XfaLDTPdrBZac1z3jMAuKr4JRpREnc92rt1douZtXuKeWLm2oi7eHVBRGSo2jVD2nWLGhKEw4WJEyeydetWXC4X8+fPZ/jw4cHX5syZwxtvvBF8brVauffee9mwYQPl5eVs27aN559/nsaNG9f+wNOc//t4OVe8vkAXtY8WGSoNqxnSnmMaU8xDxXfDgS3stbbhEved7PdnAaGaUW2biVguqzUthkJNV9E0XdWLIUuSV1DarMxkmq4KglCziBhKc2wWrRgy07yyydxLvgms87elsXKIf1rfi7ueUs0Jya/AuKd/5rkfNvCfb1enftBJU3miMalNV6u3Nn2fIUEQBKGqKIrCx4t38OPafFbtDrk3JdrfrrA00HcomzLetP+XDr5tkNOGZ9s8Tj5NgjVFatRHm4bWJDOyQPqCYR2wmk3cPrZnlfcpEdTIjaKgqRky4bSZads4g0YZNjo0zYq6/KieLQHo1zbkNKh1jZUGqoKQPkiaXJpjs5iD6QgOayAyBODByp2ea5jmuI/zrXP4ynQsv3p665b1+vxYK29dlejEUEgiLN12sIb3ID6hyFBq0uQkMiQIgpAavJof1HJPKOrjipImZ4QDN6/ZH2egeRNF5kbkXvo5rjkVwA6KKiobmlaKA22aXLeW2RHrevjMfkwe30tXP1QThAwUwFt5h85qNmEymfjx9lH4FSVmynnTLDt/3j9OF+kS+SMI6YlEhtKIVy4dygk9W/D75JO4bERHXrl0qC5NIBAZChWNLlF68K5vNAD/tryKA7dufdr+Q9rIkNZNLh2c5UI1Q4H/1bXWVsRAQRAEISV4NRbaFZViSFEUKqKkyYVjw8uLtqcZbl5DkZLBo80fhhY9g+YDh8orxZA5Mk3OSAyZTKYaF0KB7VQ+UBRdZAgCdbfOBGyxsxxWXaq7RIMEIT0RMZRGjOmTx+tXDKNVIyf3n96PMX3ysFm0YshC8xy9g85/PH9lr9KYTuzmRusXute0d+60FtxaAVTdKEwqUMVLyqy1dftXvXUJgiAczmhvqqnnFI9PiXujqV/bXMz4edL2AidallGu2LnK/X/syOgBhJzYDpXpxVBGHDFUW2jd5HwaN7lqrbO6gxIEoUYQMZTmaMWQwxqqGVIpJpN7PZcDcIPlS7qbdgRf0+Z0l2ga32kFkDcN1EJ4ZKi61tqK7nHd758gCEJ9xasRQwu2FHLOi3O5bOqCuMv1a53Lv62vMcHyO27FwvWe21io9Aqmw6k9esIjQ9rzU7cWOSnbj2RRnd/C+wxVBzFNEIT0RMRQmqM1UHDYLLQw6K0ww38k8+1HYTf5eMT2KiYCJy+t209ap8nVaM1QtVYlCIJwWKO9Yfbyz5tYtPUA8zbtB2Jd3CtcVPwqF1p/xKeYuNVzEz/5BwKhiIsaGVJrhlTDgu55AQHULMtOIwMDhVpDdZML6zNUrVVKmpwgpCUihtIcu6bPgtNqidJozsRbTW6iRHEy1LyOCyw/AvrIUGkUAwVtPnhdEUyTqzxPqAJtX1EF3/25J2nBpq8Zqvv9EwRBqK94fNGNEqbdeLTh9JssX9B/61sA3Om9hun+ozSvVkaGImqGAq/mOm0sums0v/zjhGqOvHoYuslZJE1OEBoiIobSnFa5IfHjtJlpnGF8p6zE0YonfecDcKf1PVpyQFczVBJmrR16XPdiIZgmV3k2VIc09umfue7txXy4cHtS6xNrbUEQhNQQ64ZZ08zIXj+XWb7j/2wfAfC05Qo+9o3SvR4eGQqKIU3UpHm2I+mGpqlG7yaXmsiQqCFBSE9EDKU5/ds1Dj52WC26Dtxa7FYzH5jGsczfhVxTOffa3sTtC6XJabuCayMtsWqGqlu7kzBqmpxJnzN+sLKw9oc1e5NanU7spUEaoCAIQn3FG6Pxm82qPx+dZf6Z+21vArC579/4JuvMiGXUU5haM6Teu4p2bqsrgk1XFQVf5TGwVNtAIb32URCEACKG0pwBbRsFHzttgbfrg2uP4oJh7XXz2a1mzGYrkz3X4FXMnGpZQObmWcHXtW5yOre1KGLhl/X5DHxgJl8u35WS/YiFOgL1rluktXZyJxCJDAmCIFSNt+Zt4faPlwdvmrm90X9FtQY/48wLecz2EgCveU9h9xG3kOmIjO6o6WfZYa9VO+qSYoIGCimsGUqzXRQEoRIRQ2lO/3YhMaSeeI7q0owrj+6sm89hNWO1mFitdOQV36kAdF5wL7iKAb2bnC8BN7lLpy6guMLLze8vTc2OxECt61HvDFY3c0+7fBpkAQqCINQb7vniTz5ZvINf1ucDcSJDleekY8wreNb2HBaTwkfe4/m39yIcNivZjshePOFpciqxGpjWBcHIEAo+X6rc5EQNCUI6kl6/PkIEeblORvfOY2C7RrRpnBGcbrXo3zqH1Ry8a/WM9yy2+lviLNsNPzwERHeTUyND4RGi2hQREU1Xq5napu8zJGpIEAQhEbQ22qoBjydGzZDdYmawaR0v257EYfIy3TeMyd6rUTDjsJoN635MYdbaKk0M6o/qklCaXCrd5Ko7KkEQagIRQ/WAVy8byhcTj9HlK4f/KNstZqyVd60qcPAv71WBF+ZPgR2LwwwU9JGhFTsOMfCBmbw1b0vN7UQM4ltrJydopExIEAQheQ5U1mlC4AYb6AVSONb8lbxhf5RMk4uffAO41XMTPgLRIKfNHBH9gVDSc/hrzbLTTAwF+wxp3OREDAlCg0TEUD0lPKXAbjXrfqh/9fdnS9vTAAW+uoXSsvLga9pzm8+vMOmjZRRXeLnniz9retiGqI1RgwYK1Y0MKRIZEgRBSJbCUnfwsRoZipZK3ZZ8rO+eRa6pjIX+HlzvuRU3IbdTh9VCpj0yTU5NFXNYzbo+eukbGVJS5yYnBgqCkJbUrXelUGXCf5QdVovuxAKwsOftdCr8Dfau4HrTs6y0tMKJm67Lf+Qe63acuHGaPDQt8+O1leHAA689C94KZtrzceLGYfLAfxRoMxjOe7dG9iUUGVLd5Kq7Pm2foeqtSxAE4XBgU34JV76xMPh80ofLGNmtuc7ER8v1tumYygpY5e/Ile47KMepe91hM5NlFBkyqf9NZDmsQdfQZllpJoYq/wf6DKXITU60kCCkJSKG6im2OJEhgFJLYxj3MHx+AxOUH5mg3rRbC12077wXUG/gVbb06aFdfQWw6UfM854DeqdqF4KEaoaiucklh1ZMiRYSBEGIzy0fLGPnwVAGQanbx6xVe5m3cX/EvA7c/MX8KwDTW11P8bZMThvQmq//2B2ax2phdO88Xv55E5l2C2XugImP9izVOMMWFENN000MmUJpct5UpclVd1CCINQIIobqKTZzpBiyhZkqeP0KDLyA8vwtfP/zT7iwU6HYGNmzLd+uPUiFYseFDWdGNnvLoUKx8czFI8Dq5II3lgVfn36mHabfjvnXJ8nq8UDqd6ZSsViDbnKps9aWNDlBEIT4rN1TbDhdW2+qMta8iEamUshtx41XXsWIHcX0yMsJE0NmhnVuyifXj6BDs0yGPTQb0DuqdWmRzZb9ZQA0zXaQTuj7DKXKWlvkkCCkIyKG6inhKXEOg8iQx6eAycTOgTfzt9kDg9Of6T+Ix/5cFnzeyuxkj68i8FqfgC33PH+okJYjx8Pa6Zg2/sDA7W+CcmVK90WtGTKnKE1OFxmqxroWbSnkl/UFTDyxW4TQFARBaEjkNXKwvbA8/ozAuZafAg8GXUim08HR3RwRtZ6qAcPQTk31C2tOU91aZvPDmn0ANE2zmiH1dKqPDFXXWruagxIEoUaQK7x6SrjwsVvNEXbbqgvQ/hKXbnq4dXW0AtkgJhOc+iSKNYMWJaswrfioiqM2RgmLDFXXWltfM1T1dZ0zZR7PzF7Pe/O3VWs8giAI6U5ejjP+TASME44xrww8GXRhcLo57JxkihIF0UZHurXMDj5OtzQ5NE1XVaFntVS3ZkjUkCCkIyKG6ikmkwm7RvwErLXDIkN+Ba/Pz1vztuqmh4uNhFLJmnbGf+z/AWD5/m4ojcwjryrq1tWTpF9RwkRMstbaqTVQ2JhfUv2VCIIg1CK/bSjgyZlrE765lOhP5dmWXzCbFBab+0NTffPvRNLItHN0bRESQ2lnra1pupqqmiFBENITEUP1GO1dKiMDBa/Pz+fLdvHNit266eHiJ1YfCd1yw2/gkLM9pvJCmHlXFUcdiSp81P3x+5VqRYfEQEEQhMOdi16dz7M/bODTJTsSmr+kIrI2KBwT/mCK3HeOMRGvG1lph6OLDGnEUNpZa1f+9/tJWc2QBIYEIT0RMVSP0daxOKyWCJsBr19h0ZbCiOXCdUZRAidBACw2lne4AgUTLH8PNv+c5IiNiYwMxe56Hnd9mkXFQEEQhMOZ7YVlCc2nGiVEu2Af378VTwwtor05nyIlk/mOoyPmMWqyGo52/Y0ybXx6wwim3TgyondeXaNNaUudm5yoIUFIR9Lr10dICq2JgsNqjjiJeXx+2jXJiFiuOlGXA1nd8A+5IvDkq1vBU1HldalE1AwpCu4Eo1VGpDpNThAEoaGjiqHLRnQyfN1uMTPOPQuAL3wjwRpZY5SZpBgCGNKxKYM7NElusLVA0EBBUYJ9hqrvJlfdUQmCUBOIGKrHWDXONnarOeKuk9en4PaGRMWAdoHmeZ44QiOe6YB/1F2Q3QoKN8IvTyQ77KhYNNbaiabuGZEqAwVBEIT6TiI/gYqiBMVQixxji+scSsncOB2Aj3yjDB02sxJIk6sv3XbU86lC4FwK1XeTkzQ5QUhPRAzVY2zW2JEhr9+Pq1JUXHVMZzo0zQRii6FZq/Yy9bctsTfszIVT/ht4/OtTsG9N0mNX0YoVNU3O51d0aXLJpswlWjN003tLOOfFuXEjZaKnBEGo76zdU8yUnzZS4fFFvFbh8Qd/B6OJoaFFszH5XKz2t2eF0tnQWS3THj8yVF+iI6E+Q6msGaonOy8IhxnSZ6geYwuLDIXj0USGtAYL2mhROP/3yfJgR3CIceLqczr0OBnWzYCvb4XLp0MV7ppphUbQQEHRCzavP7koUaJpct+u2I1fgX3FFbRuFJlOKAiC0FAY93SgxtNuMXPlMXoXuGJX4DffZILmGle3FjkO8osDrRmGHvgGgI99owCTYQPRE3u1ZN6m/TFFwxFpmBIXi1S6yanZGYIgpBcihuox2jQFu1FkyOcPiSGLGUvlDO4YkRatEIKAMFEUJfKOlslE/nEP0XzzL5i2zYOlb8OQy5LeB+1ItCdXbc2Qxxs7NOP1+anw+oPFu9pATywDBXU+bzXMGgRBEOoTmwoiWwWUugLRomy7lQxb6LKgTSMn+cUuepu20rZ8LYrZxme+SOMElSuO7kSWw8rIrs0iXvt+0nEs3nqAs45om4K9qHnU05FfGxmqZp+hU/u3pvwcHwPaNa7m6ARBSCWSJleP0VlrWyJrhjx+fWTInEBkyIhiV6Tb3Jo9RRz5v7W8m3lxYMKsu6FkX1LrBX2anPZuossTGmM8M4VTn/2Vfvd+R2GpO2Kd0WSOdp64aXJi0C0IQj1FQQn+NgKGUXDVVjvbaSVDU/eTlxswSTjPMiewrp7jOUBu1G1ZLWYuHN6BTs2zIl7r1jKH84/sENGcNV0xaZquqtkJ1XaTM5k4d2h7erbKqfb4BEFIHSKG6jE6a22bxTgyVCkkHNZQZCiegUI4A+6bGUyVUJn+R6B30b17j0FpPRAqDsGMycnugk5maE80Lq8vOMfR5T/Aglei5ryt3VsMwK8bCoDE0uS0+sdbDXc9QRCEdGfDvtiNo9U0uWyHlQxbSAy1auTEjoczLL8BYDri4pobZJoRyvpWUlYzJAhCeiJiqB5jC4sMheP1pSYyBPDtSn3j1g7NAnf+fFjYcfQjYDLDyk9g/fdJrVcrVvRiyE8LDjLV9hj/V/I4TL8dFk2Nua5gkzytgUIUNeRPIjIkCIJQn1m/rzj4uNwdaaCgRoayHFa0p5JWjZyMNi+miamEYntLTN1OqvGxpgv6yFDgHGFUJyUIQv1HxFA9JrJmKEaanMUcPMklGxkCyApzCfJrBMTvFR1g+PWBJ99MAndiTf5An4KmFUPZm79jhuMfnGhZhr/ypOT77i7K9m6Muq5Q09b4aXLaeZI1aBAEQahPbN0f+k0uN3CTO1geiAzlOK3kOm3B6Xk5Ts6z/ATAmrzTwJyIdXbDIOgmR+pqhgRBSE9EDNVjrNo0OQM3OW2anF2TJqcKJIfVzPj+rRLaVpZDfxJ0aQTVip2H4IR/QW47OLgVfvpvwvsQHhnKopxHrS/R75cbaGYq5k9/R65wPsX2nEFYvGVsmXo5RBEvWitUFX+UqI92FRIZEgShoaIoUOYO1X0aiaFN+aUAdGqWRctcJ0+eN5CXLhlCc38+x5n/AGB9m7/UzoDThFCmgZKyPkOCIKQn8s2ux9gjDBT0eH0KLoM0OVXIWM0mnLbE7vSF94/QptrtOFAOjmwY/1hgwtznYM/KZHYlMMadC/jWfifnWX9CwcSL3gmc4X6QdUoHri++ijLFQR/XH7DwFcPl1cBS8pEh6TMkCELDRWtIY5Qmt6Eyja5by2wAzhrcjnF9W9F5xxeYTQq/+3tTntOpVsaaLmhvrqnnC6kZEoSGiYiheoy18i6VzWLCbDZFGCh4/MbW2p7KaWazSVcsG4vwdWvF0K6D5YEHvcZD7wmg+OCrW8AfedINR1HAipe/Wz8i54O/0MGczw6lOT+OeJ3/ei/AgxWPz8928njYe2FgoVn3wv6NlctrlUqoT5F2/UZIzZAgCIcLLm88MRQwWOheKYYA8PvJ2/QpAB96R+lqVA8H1LRzRUldnyFBENITEUP1GDV/WTVPCP+Z9vmjNF3VRIZsBsYLRoTrBa0Y2qmKIYBTHgV7DuxcFNfwAICCNUyz38vfrJ9jUvxM8x3LKa7/sD3niOAsnsoUhXd9J/Gbry94y+HzG8Hv043LKDIUrc+Qzk1O+gwJgtCAqdCkxv2yPp+VOw8BsL2wjG9X7GZbYaCmqJtWDG39DUfxNoqVDL71DwvefDtcUM+nupohEUOC0CA5vH7dGhiqCHJURnciDBR8StAsQWuwoE6zmM0J/7iH1964faGTa3GFl+KKymatuW1g9L2Bx9/fD0V6F7ogigLzX8Y59UQGmDdzQMnGdebr/IuJFJNJqSbH3ePzowAKZv7hvRbs2bD9d5g/RWd+oL2TF49k+gwJgiDUZ7SRoVK3j9Oe+xVFUTj20R+54d0l+BXIcVhpkeMILbT0bQC+8o2gAsdhJwRMGgeFVPUZEgQhPamSGHr++efp1KkTTqeT4cOHs2DBgoSW++CDDzCZTJxxxhlV2awQRrzIUESfIdVNzquG/BP/cQ+PsITbc+8+VBF6MvRKaDsU3MXw7R2RKyvaDe+cDd/+HyZvBT/7+jPO9V/8vU8PpmJoUzk8Pn+w+GeH0gLG/jvwZPYD+PPXBecLRoY0Q0soMiRucoIgNCDCbwiF+raFqPDof/dynNaQAKg4BKu+AOBD3yggfvPrhoYuMuRTI0Ny/1gQGiJJf7M//PBDJk2axL333suSJUsYOHAg48aNY9++fTGX27JlC7fffjvHHntslQcr6FFT3OwGTnIQMAYI1QxZQm5ywTQ5c8LdwMOjJ+FiSJcqZ7bAhGfAZIHVX8Lab0OvrfoCXhwBG2eD1UnF6Ee4zPMP9tEEkym0L6UurRhS9EYIQy6HrieCtwLbVzdhJjAWk0GaXCI1Q/HS5CRuJAhCfSL89zpc+ECo0aqKTXseWfkpeCtQWvRmudK1ch3xa0AbEtrzidQMCULDJmkx9OSTT3LNNddwxRVX0KdPH6ZMmUJmZiZTp0avD/H5fFx00UXcf//9dOnSpVoDFkKEi6EIAwWfP2bTVbOZoECKR0TNUNhdwj3ayBBAq34wcmLg8Te3B6JBn90AH10K5Qeg1QC49ifcQ69B0XwM1X3SWsGq+xLEZIK/PAeOXKy7FnON5ZvKyQYGClGkTDJucoIgCPUJX0RkKFIMhf9m6+pHl74DgOmIi1FjJOHraOgum+Zg2rX0GRKEho41/iwh3G43ixcvZvLkycFpZrOZ0aNHM2/evKjLPfDAA7Rs2ZKrrrqKX375Je52XC4XLpcr+LyoqAgAj8eDx+OJtlhU1GWqsmw6YzEFfqDtFhMejyciNcLj8wdPYGZ8wbOXmjJhMZkwkVjqg1tz7D0eDxVhYqXMZfDejJyEdeVnmA5tQ3lmICafC8Vkxj/iZvzH3QEWO57y0DJerzeYlx6sQdLsS/CxxwOZeZjG/Bvr1zczyfoxP/iPwOs9Ao/Hg1+T9ub1+Q3fd7c7NM0d53Pl9xuvo6o01M9jbSLHMDUkchzlGNc/woWKUZrc+wu2654HxdDeVbBzMZitMOB8+DKQBu86zCJDKgoSGRKEhk5SYqigoACfz0deXp5uel5eHmvWrDFc5tdff+W1115j2bJlCW/nkUce4f7774+YPnPmTDIzM5MZso5Zs2ZVedl0ZOtWM2CmrLiI6dOns29v4LlKaXkFFV4AE7/+/BMbCkyAhUNFJYCJ8rJSNm5YD8S31168ZCnKtsAJYdasWWzZrt/Wyj//ZHphZG+hls3PY8ShxzH5XJTam7Ok43UUlveE774HoMwL6sfwuxkzcFdYABNbduzSrV8bvJk+fXrggdKIwdkDaV+ynCdsL/LNghaUbbCwR3Mctm3dxvTpWyLGddAV2u4izb6pBC4mAq9v22a8jurS0D6PdYEcw9QQ6ziWlZXV4kiEVKBNk1PQ9xlSeX/BNt3zYN+6yqgQPU+B7BbB15tlO3Tzd2pe9XNxfUDbZ0jc5AShYZOUGEqW4uJiLrnkEl555RWaN2+e8HKTJ09m0qRJwedFRUW0b9+esWPHkpubm/Q4PB4Ps2bNYsyYMdhstqSXT1fWz97A97s20bJ5U8aPP5KvDy5jxYFQ7ZbFasPrCURwTh5zEmVLd/H1tvVYHU5wuWiUk0OfXq2Zvn193G0NHDSIMb2bB4/j1wf/hP2hbfXo2Zvxx3QyWHI8voXNoWQv9pE3c5QjR/fqwTIPkxf+CMApp5zMK1vns7e8mJzGzeDAAcOxjB8/Pvh4z84+HHr9eAaYN+PMWkrn8fcwrWAJHCwAoF379owf3zdiHbsOlsOSQJSy/4CBjB/URve6z6/A74ELxA4dOjB+fJ/YBygJGurnsTaRY5gaEjmOamReqD9EpsnFj+rYLGbwuuGPDwITjrgEgJcvGcKPa/P567D2AHxw7VFMW7KDO0/undpBpxlBd1LETU4QGjpJiaHmzZtjsVjYu3evbvrevXtp1apVxPwbN25ky5YtTJgwIThNTWGyWq2sXbuWrl27RizncDhwOBwR0202W7UufKq7fLrhsAXePqfdis1mizBDKNfcDcx0OrBbA/MHQ/4WMxcd1Yk3f99GfrGLWJjM5uCxs9lsuCtNB0ymyiiKyRz92I68IbA9g5es1tBJ226z4aisfyo3uJOpot2OP6ct93ou52n7C3Rb/SLm485D0dRBmaKMy2wJpf4oBvMomvz4aOuoLg3t81gXyDFMDbGOoxzf+kd4KwSjyFA4VosJ1n0LZfshuxV0PQmAsX1bMbZv6Px+VJdmHNWlWWoHnIYE3eQUBdVjR9zkBKFhktQ32263M2TIEGbPnh2c5vf7mT17NiNGjIiYv1evXqxYsYJly5YF//7yl79wwgknsGzZMtq3b1/9PTiMUd1/VGttp00vN7SObw6NgYJaR2Q1m2iSZWf+5JPi3vEKd59W151ZuU1fFe2ptadskynUBLbUoEu6EV6/wuf+o5npG4JZ8cDnN2D2uzXrN67y1d44NeozFM2SWxBqnfy18PUkmPdCXY9EqCeE/6QZGSiEY7OYQylygy4ES40mjqQ92jQ5qRkShIZN0r92kyZN4rLLLmPo0KEMGzaMp59+mtLSUq644goALr30Utq2bcsjjzyC0+mkX79+uuUbN24MEDFdSB5VOKjRlH+c3IsVOw5xcr9WvDBno25eu8WMmhJeHCgkCoojs9mExWTCFyYczhnSjv0lLn5cmx+RdqG6yWXYLZS6fVV2ZNOaPpg0+1Tm8kZZQk9AyJj4p+dqRmVsxL5nBRNy3mcOgVS6aMOK5yYnWkioU/w+WD8T5r8EmwJppOS0gWHXgEUiNUJstDd4fH4loR5BLZVC2BCo5eSIi2tqaPUG1U3OpyjB84GIIUFomCQths4//3zy8/O555572LNnD4MGDWLGjBlBU4Vt27ZhllByrXBs9+b0yMvm1AGtAWjTOIMfbh9FYalbJ4asZlNA8IT9kGuLQS1mE4QFYyym0DKKorCv2MWPu0wcXe4JRoYy7IHIUHhaRqLoI0OhaFdZgs5Fao+gAhqxfMDdHLno75xe/D5TTb35U+mcUJ8hn+ZCwedXMBGZcy8ItUL5QVj2Lix4GQ5sqZxogp7jYfh1AYcvQYiD9vctvE1BNI4p+x4UP3QYCc0i09cPN0JpcqFpIoYEoWFSpTPrxIkTmThxouFrc+bMibnsG2+8UZVNCgb0yMth5m3HR0wP74Wg9iEKrynS/rAbueSYzaZgEanPD1e8sZh1+yx4v1odEkOVaXJVjwyFHptMpmDKX3mCaXLaO6A725zMkX1+xrrqC56wTeEv7n9H2I2raIerjt3nVzj12V/IsFt444phSe6JIFSDfWsCAmj5B+ApDUxzNoLBl8KRV0OTTnU6PKF+of1dLNP8lv5zfC8enm7k/KpwdHFlc2yJCgUw0D3iJicIDRO5zdgAsYVF5lQxFN5gVfs8XCgBWDRNWX2Kwrp9JQD8umE/TbLsAGTYrcHXq0J4TY/datzgLxpeTa2STwFOfZJDa+bQi+3cbJ3GRiYZLqcVSeqFw6FyD2v2FAPh3dYlSiTUAMFUuCmwaU5oeovegSjQgPPAnlVnwxPqL9rIkHpjyWI2ce1xXfH4FB77bi0AZw1uy7QlOxlmWkNLz06wZ0PfM+piyGmHyUANSWRIEBomIoYaIBGRIYtxZEg7n9Edr/A0OZXGmbZIAwVfFQVD5WKqLtN1QU8A7R1Ql9fPd1u8zHfewD1l/+EGy5c8XXYKMChiOaPIkPYCQq2rEoSUU34wUKi+8JVQKpzJHEqF63Rs6AshCFVA62ejRoaclTfFtMY6LXICrq3nWX8KTOh3lgjwSoy+ghIZEoSGiYihBkj4D3YwTS7GBZZRZCiQJhd4rBUdTTJtbD9QAUBmZc3Q13/sZlCHxpw2oE3EemKhrlXderJiSJue99h3azhQ5gEGMNA2ktMtc7lo9yPgORNsTt1yOgOFSiGnrXsq1Rg4VKt8qGgX/PAQ7FkOoyZDr1OrsTKhXrNvDSx4qTIVrrKRqbOxJhWuY50OT2g4+AxqhhyVN660ZgpOq4Vsyhhvnh+YUNlbSDA+X0pkSBAaJiKGGiAmkwmr2RQUCsE0uTCdoU0FixcZ8mhOoE0y7WzMD9Q1OCvF0J6iCia+t5QN+0o4e3A72jdNrDu5EowMBbZTnchQQAgFuNdzGSPMq2jl3go/PgRjH9QtpzNQqLyNqo0WacVQlWy2XSXw2zMw9znwlgemfXAh9P4LjHko+fUJ9Zdt82HOIyFXOICWfQJRoP7ngT2x74ogJIpRzZDqOprtCJ327VYzp1l+J9PkIt/ZiRbtjqzdgaYxRrLHJBFbQWiQiO1bA0WbAqdGb8LvdGkLa6PdBVOn7ysKNWXNcVqDdxczw3obPf39es6ZMjfhcao1Q+rW7ZbkTjbRjBsOksM/PVcFnsx9LnBBqt2ukYGCZmKJRgwl4Eobwu+DJW/Bc4Ph50cDQqj9UXDUjQEnsNVfYn3paDoW/BBwbqoPKAoc2Fp//cZL8uHXp2HHotrd7r7V8P4FMHVsQAiZzNDrNLjsa7hhLgy5XISQUCMoBjVDqhi6dERHRnRpxoOn98VmMXGeZQ4Af7ScIOmZGsIPxejeLetmIIIg1DgSGWqg2MxmKtA7voWH+LViKLzOCAJpcqoY2l1UEZzu9SsR1tpa9mqEUzyUsJohNYqlkuOwUhyj51CsZq/f+4fwe85YjiqeCdOugdH3BeoybM6wyJBBmpy7CpGhjT/CzLtg78rA8yadYMwDgWiQyQSDLoKvbsa0czGDtr+B/63V8JdnoWWvxNZfF/g88PHlsOZr6HEyTHgGclrFXSxt2PgDTLsOSvcFnncYCUffAt3HQk21ADi4DX58BJa/DyhgsgQcuo79u6TCCbWCPk2usmao8jyQ47Tx/rVHATDtu+8ZbN6AVzGztsV4Tqr9oaYt4QYKd53ap45GIghCTSNiqIGiFTfqSTDcTU7bf8IoF9piMqFO3n2wPDi9wuMLppQZiaFkCNUMGafJNcq0xRRD3jjGDR+3uImjTH/Cwa3wyRXgyIW+Z5DR6jRM+FEwByNDWs1TUpGEGNq3BmbdHXAGg4Al8nF3BBpkWh2h+Vr1g6tm4ft9Csr392PdMR+mHBO4SD52kn7edMDvg8+uCwghgHUz4IWj4NQnA4XW6YzXDT88CHOfDTzPbQcle2Hb3MBfi14w8m/Q/9zUHffS/fDL47DwVfC5A9N6/wVOvBta9EjNNgQhAfRpcpU1Q9ZI8d9r95cA/OA/Ak9Gi9oZXH0h7JQo9UKC0HCRNLkGilUjKtTIULhJgjYyFC6U1PnVE4A22qOtp8mwVVMMBUNDgX/hYqhxpi36MuhP+kaUmnLgqllwzKTABbGrCJa8Rffp5/GL41b+bv2IxmVbAuvSpcmFjk3UbZTkw9eT4MWRASFktsLw6+HmZTByovFFttmC/8hr+aH3I/i7jQW/B376T0AUbU08vbDG8fvhy5th5adgtsEpj0GrAVB+ICAqP7kSygpTuskFmwtZvDUF69y/MZCapgqhoVfCxIVw6x8w8uaAIM5fA1/cBM8MDNR2VRyq+vZcJTDnv4F1/f5CQAh1Ohau/gHOf1uEUC3y/PPP06lTJ5xOJ8OHD2fBggVR5x01ahQmkyni79RT67/JiTZgXu5R0+TCfqt9Hrrs+gqAD32jsFnlYl9L+CnRyGRIEISGgYihBopdIyrUmqFwwaNtbBo1MlQ5vbgiZE6gFQqZ1Y0M6bVQRJpck0x7xDLaOqF4zV4VFGjUFkbfC7euCNRrHHExPls27UwF/M36OX9bdQG8ciLZy6fShCLA2E3O5a3cb08F/PpUoC5o0Wug+KDnqXDjfDjlv5DZNO5+l9ub4zvvXTj3DchqCQXr4PVT4KtbAtbLdYmiwLd3wLJ3AnUu57wGw6+Fq2f/f3vnHR5Hde7/78xs06pYkm1JLrLl3nBDxkY4VMs2GAgtiSkJxJc4N2DnkugXQpzc2CHNhHAdbogDicHApQQCFwi5McZCWMYG495775IlF3Vtm/n9MTu7Z9rujHbV38/z+PHuzJmZM0e7O/Od932/R454cYIskv5cBBwqTcoha5sD+MZf1uOe59erzDpss+Mt4C/XAWe3yU5ts18HbvuDXJuT0Vc20vjhbjl9Mb0PUHcOKF0ILBkDrPq57P5nlaAf2PBX4I8TgPLfAv46WTB+8z3goX8C/Qtbfh6Ebd5++22UlJRg0aJF2Lp1K8aPH4+ZM2fi/Pnzhu3fe+89nDt3LvJv9+7dEAQBX//619u458mHjWYHwtFzt1NzuT/4MTz+izgvZaJcnKC6ZhD6OlqjB4YEQXQN6Nevi5LqjooUJZVNK3hYIWEohnhE0uQaGOGkCAWeQ9IuoNF5htT9yEjRR4bYSE28yJAqw43ngUHXAncsxfbZG/F9/3x8GpqAEATgzBb0Xvuf2Oieh2XOZzCgYhXckFOd/rXrHH75z70Y8Z8fYeM//wr86Srgk1/IUaY+42WBdd+bQK+h9k96zF3A/I3AlQ/Jy7a8AiydDOz5oH0MCyRJTvnbtAwAB9z5AjD6DnmdwwXc9DM50tZrOFBfAbzxNTmC5KtL6LA1jBNgvNRHQ5prgfe+K6f1+euBgVOBRz4HRt2ub+vpIdcNPbYTuOPPcsqcv06OJD07DvjgUdn8wAxRBHb+HfjTJOCjx4GGKiB7MPC15cB31wBDp1EhejuwZMkSzJ07F3PmzMHo0aPxwgsvwOv1Yvny5Ybts7OzkZeXF/lXWloKr9fbJcSQ0STYugdXm+Vx+d/QtQhBsO3k2dXRfoNbq8SQIIj2h2qGuiisfarHJE2Oxcham+e5yNMwIwtrj1MwzaMOiZKlHOtoZMi4ZijTQAzZiQyZrQ7yHvxTvAb/FK/BnNFeLBq0H82b34CnehemC1uBY1txs9uL/wtNwfuha7HjiwN43/UGJm45LO8gva8cbRr7jcSvkilZspHCuNlyZOjCIeCdh4DhtwC3PgP06J/Y/u1Q/pTsvgfIEZXxs/Vt+hcC//4ZUPZLOS1s66vA0XLgzueBgqktOmxCuu/MFuDdh4FLx+RI1g0L5DosPk7U0uECJj4AjL9PTnP84o/Aic+B7W/I/4bNlEXTwGtkcSNJciSs7MmoSUZaLnD9E/JcQYL+s0q0DX6/H1u2bMGCBQsiy3ieR3FxMdavX29pHy+99BLuvfdepKYaTzrq8/ng80XThWtr5ShyIBBAIBAw3CYWyjYt2TYefr9+n16XED3WxaNwHimDBA5vhm4CAPCQWqUvrU1rjWMwqK5VFUOhTjk+VmnNz2N3gsYxOVgZx2SOMYmhLkoqI4bM0uRYzNLkjOZVuNwkfwBH5KVDMBECDf4gMjzxbw4j1tombnKGaXLhNKp1h6rxo3d2xD2CEaxIusxnAVc/gmMDH8D3//g33C2sw72eL5EdPI/7HatxvyM6P0yD5EbqTY8DRfNs2yLX+4JwCbzh/BUAZCHxvXXAuiXA2iXAwY+A42uBaQvlSTnj3dwnyrpn5folALj5KWDSHPO2zhTg5sWyO98Hj8oGFa/cKo/LTT/XTXIbD4n5O0kmfzP9RiL49X+UU9TEINAjH7h7GTCwyNaxwfPAiJvlf6c3yzVE+/4JHPpY/tevUHaD2/WuLJYAue5o6mPA1Y8ALuObZ6LtqK6uRigUQm5urmp5bm4u9u/fH3f7jRs3Yvfu3XjppZdM2yxevBhPPvmkbvmqVavg9bbcIr20NDmppiyHawHt5b363GmsWHESADD6zN8wDMCRlHE41SyP2b49u7CiamfS+9JWJHsc5WSI6Bh++sknSO0Gzzta4/PYHaFxTA6xxrGxsTFpxyEx1EVJ90T/tFEDBXWbmWOiNw7GaXJczOhO4YAs3USuCvXNQaS7HXh3y2lcVZCNgl7GN4zamiGdm1yMyNA3X9qgW6fFLDLEmjBE5hkSJRyW+uPp4L3Y0Gce/Ec+w138OswSNiAFPvw9dAOWBL+GTdd/M+5xtdQ2BzDuF6vQPysFq0uuNW/o9AA3/lROn/vnY8CpDXL9zs63gVnPAP2utH1sS2z4K/DJIvn1tIXyTb4VBl0rp6N9/FNg22vA+j/J0ZO7XrDVVzYyFCfYJ1NXgaIjv4ewfY/8fvQdsu13SpblYxrSf5JsenDhiBwh2/6mHHk6s0VeL7jl+qmvlFiqDSM6By+99BLGjh2LyZMnm7ZZsGABSkpKIu9ra2uRn5+PGTNmICMjw/YxA4EASktLMX36dDidyb3L3nDsIp7bo55X64rhQzBr+jAg0ATHc48BABonPQKE7zUKJ07ArPF9ktqPtqC1xrE5EMLjG8si72+eOR3pFh7wdVZa8/PYnaBxTA5WxlGJzicDEkNdlFSXPk2OjQz9+3WD8f1pwyLvzcRQrEy3woFZqlqifpkpaPQHcakxgAZfEJuOX8Lj78pPGvf/6uZIP1iUQl8lAqWtQeph4CYXr06IRTLJv2J3ocxVxDat84WwVRyD9eIY/Dw4B04EUQ8vPNoiZItsPXEJAHD6UlOclmFyRgFzVgJblgOfPCnfjC+7UZ6raNrC5M71s/U1ufYFAK57XE4xs4MnA7jjT3J9zoffB6oPAC8Wy/u67keW0sfYv1JcK/ODq+D44BHkNFZDcqSAu+V3cppaMut0eg4Bbn9WFqYb/wrsXyGLuxt+0rZpi4QlevXqBUEQUFlZqVpeWVmJvLzY35WGhga89dZb+OUvfxmzndvthtutd4h0Op0J3fQkur0RnEEUOcPrlo+z5x3ZFbLHADQOnAZgEwAgxZ38frQlyR5HkVP/1rtdLjidXf+WqTU+j90RGsfkEGsckzm+VBLYRUljI0MGBgq3j++rqisyFUMx1NDovhmqyJBD4CLHrfMFca4meuP/982ndNsHQiJmPvsZAPPIUIbHoRNk8eqEWMxasjfcSsE+W3TcwDjm+eBCPeQ0GHbM7NCimhiel9Pj5m2U64kAuZbluUJg7X/JrnaJsutdWcAAwNXzgBt/1vJ9DZ8JPPqlHNWSQnLK3YvF8jxMcWBFq2RmJhf0ASsXAG9+HVxjNWo8+Qg+XAYUPtR6hgVpOcBN/wk8+oUs+EgIdUhcLhcKCwtRVhZ9ki+KIsrKylBUFDtt8p133oHP58M3v2k/4ttRMXpgFLkmbAqnAk76tupmggwU1GgnXaV5hgii60K/fl2UdIOaIVbYaCMcRrU/PMfFrDNK9zhV2wk8F4lI1TcHVRePnaf187jsPH05YvsanWdIfTwHz+sESMiG25iZbhIN5ioSVfMMGU/06nW1TAzFjXbEIqMPcPdfgYc/AfpNkt3Syn4pu87t/bDl7gP7/ik7sEGS5+KZ+ZvERYU3W7YL/9pyOWXt3HbZ6nrds8CpjbLldeUeoOogcPEYUHNGnq+p6TJS0AwHghBFAzVUfQh4cZps2AAgNGkuPhuxSHa1IwgAJSUlWLZsGV599VXs27cPjzzyCBoaGjBnjlz79uCDD6oMFhReeukl3HnnnejZs2dbd7nVMHKTS3ML8vfvzGZ57rCJD6oi8Q6BbvZZtD+FZBBJEF2Xrh/z7aawBgqRmiHm11w7AZ+Rm5ycJmd+BfC6BJVYcvBcpFapwRdUWST7g/obXJWFcvil1kBB4Dmke5yobY6Kk4DRzbIJZmly7GIl0sS2bfCbiaGWmRiwoky0EdlSkX+VbGu96x25vufyCeDv35In+Lx5MZA31vq+Dn0CvDNHjuCMvw+Y9V/JvdpfcY9sb/3h92WnNqUeyYTBAPYpngvPQL5ZE1xyip3glCdFDfmBlGzgzj9DHFwMccWK5PWX6PTMnj0bVVVVWLhwISoqKjBhwgSsXLkyYqpw8uRJ8JqHPgcOHMC6deuwatWq9uhyq2H0u5fmdkajQmPuBNJ6w1EXzbmneYbUaH8NaZ4hgui6kBjqorBpchFrbea3XFu/YyR62ElXtfAc4HbwqugPG8Wp8wVVFxMjMcQ+vVQEjvaCzDMCK7KdrZoh4+VGkSF2rs8Gk8hQagvT5FTHSyRKxPOy3fXIW4HPn5WL/I+vlaMvVz4kp3Sl9oq9j2NrgbcfAMQAMPpO4Kt/ap1JNNLzgPv/Dmz9H2DjMnleJjEoi5qQHwiFX4sG9phiQP7Hriq4Vo6QZfQFyLaUMGD+/PmYP3++4bry8nLdshEjRpg+MOnMGM1b3INrlNNiAWDSwwDUqXGUJqdG66RKaXIE0XUhMdRFSVOlycmv2VobbZqc2TxDZr//qS4HOI5TbecQuIhYaPAFIxEpAPAFQ7p9sJEh5bXToe+XVgzZmZTTzKZZVEWGxPAy/aztWloqhiQD8ZUQ7jRZ+Fz5IFC6ENjzPrDlZWD3e8D1PwYmf1eeR0fLqY3Am7OBYLM8j9HdywChFX8GOE6u6Sl8yLyNJGHvmYu450/lcCKIsh9cg94pfFgohQUT75BT4ujpLEHExeg3Jv/k+0CwCcgZAwy4GoD64ZM2Rbm7ox0No2kmCILoGtCjoC5KmkGaXICJzmgjQ8YGCuapAR4DUwZWuNQ0BRBgLsh+g0eVIYPJU7VPJ3mO09mZtlZkyEr6mtcpICRKhn3YdPwirv/9apQfOB+zH3YMIOKSOUCu0ZnzEZA3DvDVAKt+BjxfBBz8WH3gs9uA1+8BAg3A4Bvl7YwEU1vDcRA5B5rgQS3SEErpDfToB2QPAnoNA3LHAL1HkBAiCIvoaxQl9Nz3uvzyqocj3yWnI/qdosiQGvq5IYjuA/36dVFUYsgl/5nZaIf2wmckhvgYaXLKE0VtmtyQ3mkAgE/3n49MjgoAvkD0tSRJOF/bDJ9B6pz26aRgEBmyUzNkZlxgNM+QVY0yfcka3PbcOl16zTdf3IATFxrx7Zc3GfQj+jopkSEtA68BvlsOfPU5ILU3cOEw8OY3ZPFTdQCo3Au8dpecqjbgGuDeN21PjNqasGOSkNkEQRC671ARvxeuy0cAVxow7huR5ZQmZw5Fggii+0C/fl0UNp1LiQLFcgsyn2fIeBtFtLDbCTyHu6/sD5fAY+fpGpWDHBsZeu7Tw5j82zK8/Pkxg/3qRZrOTS4pkSH9/qzchJ+61Iij1Q3Yd64WzQG1KDMSd5FjGIivpMMLctrc97cCUx+TTQiOlAF/LgJevlmeW6RfIXD/24DL2zp9aCHs+JAYIojE0P5GfksIz6w6/l7AnR5Zzv7e0r0/QRDdFRJDXRTW9UypGZpckI1bx/XBD4qH6dobiiGOg9nDQodRZEjgkJ3qwlWDsgAAu89ExRAbGVpSehCAPEu6br+8UWRInSZnq2bIQppcwGCeITMCRpXJFggx0awWu8lZxZMBTP8lMG8DMOJW2TGuuQbIHQt883/l9R0MdkxICxFEYrC/bzm4hBn8ZvlN2DhBgRzkCIIgyEChy8JaVLvDr3mew9L7rzRsr4gQgeciTxX5GJEhtr12Wc9UeZb2qnpfZJ0/JOLjPRWGrnIsusgQl6CbnAUDBUWoWHGVYlMN7bjCBYJtEBnS0nMIcN+bwNE1suPclO/Jc/90QIKUJkcQlvlz+WGs2lOJ178zxXAiaPaZzX3Cp3Bwopwemzta1Y5MEwiCIEgMdVn6ZaZg1tg8uB2CJQe0AT3ltKlhOWnYX1EHIGytrZlHSLlpVcSWOjIkL8tOlYvyLzdG7Y8vNvjx769tidsPbSpfojVDZvfVRjVDVoI+rJizKsp2nLociYbZ2S5pDL5e/teBEVViqB07QhCdgKdXHgAAvLb+BB65YYhuvfJAwYEg7nN8Ki+86mFdO4HnkOV1oqYpgAHZHSt1liAIoq0gMdRF4TgOf36g0HL77103BDNG52L1/ir8ZsU+AErNULRNiktAXXjy00hkiNNHhjK96rQ2QHaXs4KD19cM6SJDIcny3CBmUQZDNzkL+wy2IN3tjqWfq963uRjqBLRWzVBtcwDHqhowrn8PKogmuhyNJpNDK79N0/ityOMu4RLXA1mjvqprx3EcvvzpNIRESecwShAE0V2ghGECgJwSNzQnXeUex/OcKvLDzhvkNKgZUl4rkaGWoM1hF3ggQ1szJEqm8wBpMWvFBpeUGqRYAkvplyoy1MKb9jZLk+tEhFQ1Q8kbn1ueXYs7ln6OT/bp7c4JorNj9lui/DYpxgmrPDNNbfTdDiFSV0oQBNEdITFEqGCz1ASOUz1Ndzv0NqysGFKWZXpbLob0aXI8rh7cEzeNzIksC4kSmg0mcTXiaFWDYZ2SUWQoVpqckhbIOsi11AghZCPNr7sgSq2TJnfmchMAYMWuc8nbKUF0EMyizKIoYTB3Fl8R9kCUOKxJu7WNe0YQBNF5IDFEqBBUkSH1e9aUQREtDoPIUJZBmpxVdGKI45DqdmD5t6/C1KE9Acipar6ANUFR0xTAnFc26pYbTYIaKz0rIoYYEUaRoeTBCtHWMFCgBDmiMyNJEn749nb8/uP9quWmYkgCHhDKAABl4kTUp/Rt9T4SBEF0VkgMESrYNDmB41Q1QazTm1Lbwxu4yWUlEBlyamuGBFZsyeuCIQnNAWuRIQD4/PAF3TJ1ZEjULdOiRMXYJi2t/WnrmqFNxy/i+fIjrW/pnQCqSVcpcEYQKnadqcH7285g6eojquVmvyVcoBFfF9YAAF4PTYeX6oESgsoNCaJrQ4nChArWPU7gOdVFwCWwUSJ9ZEiJ6mQlUDPEh00blGu8kUFDSJRiTnBqBbGFkSGWlgYw2joy9PUX1gMA+mZ6cMeEfm16bKuIrWSgEIFuZohOTKPf+OGPmRgqqPgIGVwjTog5+EwciztdJIYSwWyKCYIgugYUGSJUsOJDa6DgMIoMqcRK2Fo7gciQ9jhsoEjpS1C0FxkywtBNLoa+chuIoZZGeJ4tO4yLvvjtks3Rqoa2P6hFgioDheTvnyM1RHRizKK6hg9WJAmjTv0dAPBGaBok8OQUlyAGc5ITBNGFIDFEqNCmyfGqNDkO0/qKSHULKJk+HIC6xkeJ3KS4BEPxYBVVtIlnTRsUMSQmHBkynGfIZmSopTVDXxy5iD/tafubk478cFM9z1Ar1Ax14HMniHiorOdFfYqvijNb0bt+P3ySE++E5PnFvBQZSgiy5SeIrg2JIUKFoInE8Bq3uK8OFLF5wY0o6JUqt2HT6hhhZDQrulVUqXqqtL1ozZAv4chQ9HUwXL0fy9LZ7dDfTCRSg3PBRxdXllBri6Gk75Eg2g72+xEyeJDDUr/uBQDA/4lTcAkZANTTIhD2ocgQQXRtSAwRKrQ1Q+xFQInMsGlsAm8sXBKJDLEP4dg0OaOaoVF9MvD9m4baPobWylkUpdjW2kLyIkPthdW893M1TW1u8hBqJWttgugKGKX1al8DABovwrn/AwDA68HpkcUpFBlKCEqzJYiuDYkhQoVWDJm5ybFtFNh7bXcCTyKN6pDYY7E1Q6kuAQOyvXH3yUZxztc247X1J1TrQ5Jk20ChrQVDoli5nK89VIWixZ/i31/b0ur9YRFVNUOUJkcQLGbW87rI0PY34IYfe8SB2CZFHxJRZCgxKDJEEF0bEkOECtU8Q5wmTY6PI4bQupGhSM1QKFoz5HbyliIeTUxa3b1//RJHq9VmAiFRipMmpz8fbbp+R7/httK/lz8/DgD4ZF9l63ZGA0WGCMIcs2hQKMR8WUQR2PQSAOC10HSwjz8oMpQY5CZHEF0bEkOECn2anNpAQUtrR4YETX8A+WmoIm5SnA4YaDQdrDWtVggp+4wV6TE6Hytpcq0R5WgpVoqAE6n1SoRWN1CgNBeiE6NK62UewqgiQ0dXA5eOoQFe/CN0jWp7igwlBmkhgujakBgiVLDpAALHqQwVnAbREXVkKEoikSFVHwyc5UKiFBE3KS7B0lO7eFbcoZAUMyJhGBnS3LQb9aKzpdKltpMYanUDBbqZITopXxypxk/f3xV5H1LVDzHKKBwV+tQzDU3wqPbhcdKlPhHITY4gujb0C0moUKXJ8eqLgGFkiL1IJM1AgTN8rYoM+YMAAK/Tmhgym7RQISiKtmuGrLjJtfUEq7GIN0xrD1Xhy6MXIu//+5NDaIozbsmi1ecZonsZopNy/7INuNwYiLxXmSkoLy+fAg5+BAAoS7tNtw+j3y/COlQzRBBdm/Z5DEx0WFTzDNk1UGCWJzLJn9mFx8HUDDX65WUpLkHVBzOa4kWGxDgGCkZuchqhw3Fc5E4+JEoQeA6BGBZ1IVGCM2avEodN04uVKiaKEr710kbVsj98chAOgcO8G+279dlF7e7XGgKS7maIroHhPENbXwUkESi4FhdCgwBUq7YxmhqAsA5Fhgiia0OPiwgVgqZeR+3spr8gmF0kEooMmdy4OpjIkBLp8boES0/tGsORJDOCYjRNzmiCQqPziVUzpIigWGlybJ+2nLiEZz4+AF8wuZEY9vixrud+E9F2pKo+qf0xQ+2W1SaHJIhOiWqeoZAEBP3AllflBVc9bPhblcjvMUGRIYLo6lBkiFChdnLjVOYELoEHYszFozJQSOBJpNmFR2BqhvxhNzmvxZqheOleIcZAIdXt0KXVGUXFdG5yzOtASITHKSAQMr+zr/eFkJ0uv77n+S8ix37khiEx+2oHNv0s1iiZ1VRle11J60ssWjsyRA92ia6Czllu/z+BhvNAWi4w8ja4t+/SbUNpcolBkSGC6NrQLyShgo3KCFz8NDmzbdmC3funDEB+dgoG9ow/HxBgfuFxGLnJuRyWxNBfPzuKx9/ZgYqaZsP1gZAYSSkzclQzSsWLFRkKhkVQUKuYGBp8+mjV71bux0e7zpluYxdWDMUaJ8WqXEt2WtuIoZCqZohCQwRhBvuTEpIkNK9fBgCoH/MAIDgNhT+lySUGRYYIomvTIjG0dOlSFBQUwOPxYMqUKdi4caNp2/feew+TJk1CZmYmUlNTMWHCBLz22mst7jDRdsiRodgGCixmkaGvF/bH2h/fhCv69bB4XOPl6pqhaJqclZqhDccu4p0tp3H14jLD9XJkSH6d6tbfOBidu9ZAgRVHSppcMGZkyDh175E3tppuYxd2HpJYmtEXMBZDbTW/hspNLkb0saXQvQzRVWAfsPT1H4fnzHoEJR7zDoyT1xv85uSku9usf10RmmeIILo2tsXQ22+/jZKSEixatAhbt27F+PHjMXPmTJw/f96wfXZ2Nn72s59h/fr12LlzJ+bMmYM5c+bg448/TrjzRPKREL2QaucZcsSNDEVxM5EhJaJkVHNkhNmFR9k+JEpoCshCIsUpJCUFKsgYKBhFhozOXZuuwgY0AqISGTIXQw0xUveSFR2JFZliaTapVQqYRIySDaXJEYQ12N+Um5v+BQD4RCzEmgpXeH30O9srzYW3v3s1slLbJsLbVaGfD4Lo2tgWQ0uWLMHcuXMxZ84cjB49Gi+88AK8Xi+WL19u2P6GG27AXXfdhVGjRmHIkCF47LHHMG7cOKxbty7hzhOti2ygEH0fLzLE4mEiQ0pEx2FldlSYX3iUmiHWQMGqm1w8ZDETQwwZHEM0iARF3geVyJC9NDmFWCLq8Pk6nL3cpFseEiXsPVurcZuyJjLMIkNmxgoKaw5W4cW1RxMWb+p+JrQrQ2jSVaKroPzWeNGMm3yfAgBeDxUz66NfoGE56ZgyuGfbdrALQjVDBNG1sWWg4Pf7sWXLFixYsCCyjOd5FBcXY/369XG3lyQJn376KQ4cOIDf/e53pu18Ph98Pl/kfW1tLQAgEAggEAiYbWaKsk1Ltu1uBJkIQSgUhCRG3/PhqJHZOIqiGFnn4JkakFAIgUAAAhf7LlfZljNYBgCcJN8EBIIhNIaFhIsHxFDiDmzN/gAC4XP3GBQbc9D33R8IRvrXpBE2TT4/AgEXmv3mn7maRp/pWNY3+QxFWXW9D8VLPgMAHPrVDNW6xR8dwPIvTuCR6wahZPqwyHlF+xsyP16zz3B5sz8Y83vz0HI5RXZ4jhdFg3viXE0z9lfU4YbhvWzdQPiZz10gGPuYgP3vtCRFP5s7Ttdgz9la3HdV/25/k2NlHOl3s2OhpMHdLqxHKppwhu+Lz8UxAGSHSvbBTGOcKQUIa1h8jkcQRCfFlhiqrq5GKBRCbm6uanlubi72799vul1NTQ369esHn88HQRDw5z//GdOnTzdtv3jxYjz55JO65atWrYLXa60I34jS0tIWb9td2H+ZAyBHdVZ9vBJnGwDlY3LowD70zDEaR3n9wYMHsKJR/hwcORfdz+drP8PBFODMaR6xgpErVqwAADQ2ClAkkbIMAPZXyvs8c+4cqhs4ABx2bNmAoBg9VktZ9/nnOHRR7t/F82d1/dy/d4/uGJu3bkXohHxj0hAA2K/T6jWf4WAqcKpevZxl6849SD2/OxwJUbdZsXIV0gwmITpUEz1XdmwAYPl6eR/Pf3YMIwOHAADVzdF979u/Hyvq9xn25cBl4zE8ePgoVoQOG24jI+975WcbcWm/hMfCffjOiBDGZlsP8Rw+Hv1sbNm6FeIJa9vG/07L/Tlx/ARWrDgGAJE+njq421YfuzKxxrGxsbENe0KwGEVcl66Wv4+Tefm3dq3nBkiN8nfnaFWDqmaoMUb0mbAO1QwRRNemTay109PTsX37dtTX16OsrAwlJSUYPHgwbrjhBsP2CxYsQElJSeR9bW0t8vPzMWPGDGRkZNg+fiAQQGlpKaZPnw6ns7WnuezcpB+uxvP75AL+22bdgv0V9Xhmlxz1Gz/2CqByl24cH1u/CgAwcsQIzLp+MACgdtNpvHd8LwCgeNqN6JeZgs3/2o/PK0+aHnvWrFkAgD8e/hyVTQ2qZQDQsOU0/n50L3r2zsFZfy3g8+Om665FnS+AP+3dbLrff792EP6y9ljM807pPxqf7D4on8eQQVh//oSqBmji+LF459he1Tbjx0/ArHF9AABVdT5g85rIuquvmYqx/Xpg26nLwC5jg5Ehw0Zg1rWDZdvvL9XGDtfecBP69PDotll3+AKwdwsA9dgA0b8Du+5YdQOw7XMAwNBhwzHrRmPbbvf+88C+7brl/QYMwKxZow23YY85dtw4zLqyX+R9IHsQZs0aabqdlq0r9gPn5M/GhAkTMWtsXsz2Vr/TSn8KCgZi1qxRqmWZA0Zi1nWDYh5HFCVsPXUZI/PSDSN1nR0r46hE5om2xyhNddXeSgDACO4UAGCvOCCy7sSFRgSYmqGpQ3u1cg+7BySGCKJrY+vq3qtXLwiCgMrKStXyyspK5OWZ37zwPI+hQ+VZ7CdMmIB9+/Zh8eLFpmLI7XbD7da73zidzoTETKLbdwccQvQj4XK54HZFx8sTfm02joJDiCxP9UTXp7hdcDqdcMWxd1W2ZWuA2OO4wq9FiUNzuMYlw+uG36CspVeaG9X1curXgltHY9vpGmw8dtH02ItXHowe0yEgxSmo5hpyG5wvx0fPF7z6CazE8XA6neB4+ZwH9UrFjSNysPzzqCgLSRycTifq/PqnvyHwkX0HQyLWHKzClQOyVPkaDofDNM1L2VY5fviN6ec/JKkjYR4nj+aAiKAIS98ZgR0LAFyMYxkTPQ+Ot75trO80WzvFG+xTEIS4x3lzw0n89P1dGNM3A//6j2st9akzEmsc6Tez/fCbGJjwEDGMOwMA2BvKjyxvDoQikaEbR/TG4zNHtH4nuwGkhQiia2MrE9blcqGwsBBlZdGn2KIooqysDEVFRZb3I4qiqiaI6LhYMVCYOlQu0L1zQr/IMnaSP0XcOCwaMMRzkwuKIhr9svjwugSVIHjuvon40YzhKCu5Hv9+/WA8O3sCAHszsPM8hxSnWrgZ9Z0t+tfa2SpFzEr+voPndPtQbnSaDPL6fUwNzcufH8fDr27G3c9/obLKDmmcBowmVgxaNVDQuMl5XQ5VH+1i1xGOtSVPlpkc2wcj0SgZ1IFp+d+tpwEAe85SdIRoe8y+fwVcBdxcAM1w4aA/apDgD4mR35x/+8ogpHbBaGZ7QFqIILo2tn8pS0pK8NBDD2HSpEmYPHkynn32WTQ0NGDOnDkAgAcffBD9+vXD4sWLAcj1P5MmTcKQIUPg8/mwYsUKvPbaa3j++eeTeyZEq6CeZ4iHUQb6a/82BU2BkOrCyzrHOcOvnQZVqCPz0jHvxqEY1z86B5HppKthMdHoD0UcxzwaN7lBvVJx+/i+AIAFt4xS9d0qPCe71KEh2seJ+Vm6dqp5hTQW1pFJV8P/OwRe53qnpMA0GVhss+5u/7fzLAA55Y0VNyFJUn2BU12C7uaJFWlGDnXBkAiHwEcibQqKGAxoRJ5Sw6D9G2mFhV1Bw2YDJctaO9akuFahCWCJ9sTMzXE4J4v0I8hHrS/axh8UI99zq+6dRHwoTY4guja2xdDs2bNRVVWFhQsXoqKiAhMmTMDKlSsjpgonT54Ez/wINzQ04NFHH8Xp06eRkpKCkSNH4vXXX8fs2bOTdxZE0tDe+rEXAafAQ2/oLAsm7RNI9sZfETFGFtgCz0XES/SYxn1TIkN1zVFJ5nUKqvZm0Sc7tuA8x8HrksXAozcMweMzR6CitlnXTowZGQpba4dFktHxlTbNhpGhqFBi0/XYOUS0Uwh5XQ5calQ7f6nbq/t4rqYJM/7wGe65sj8G9lQbk6SEz9+nEVdzXtmEC/V+fDBvqurvqdUMdgWN2ArW2mwX6F6G6Gz4giG8ucG4xnIkLy/fF+qvWr5qbwUOn68HALgc9KFPFiSGCKJr06IY+vz58zF//nzDdeXl5ar3v/71r/HrX/+6JYch2oGrB2djQLYXQ3PSAMhzDSnYERQOAzFktL3RNcbsuqPMM1TbJN/wuwQeDoFXTwxroqTsRYaiaXICz4HjONU4KLA37bp5hhQxFBZJAs/pBEK8NLmQKGHckx+rojMhTWSIRREwLNqJYVmWfXYMdc1BvPLFcTxxs9rsIBoZip6XJEkoP1AFADhQUYfRfaNmJlr9YlfPhFph0lX2fFs6z1B3t94m2o9lnx3Fc58aOzkqkaF9oloMfX74QuQ1RYaSB/0MEETXhhKKCRVuh4DVP7ohEm1hLwJ2BIUqMhS+KDsMtjd64mZaMySoI0PKzT/bXjC5AXDZFUOafRvdFLM38NoUNEXAKMudPK+LnsRLk7vY4NelqQVj1AylGoghbVodC3tK2poh5fzZtLtYE7hqz037PhAS8YsP9+ArQ3vhlrF9dP1kI0PJSk1LhqiiNDmivfjsULXpOsVJ7qCUb9rGao0mER+KDBFE14YeHRE6lGiI8lrBTmSI3S5ioGAQtTESGaY1Q+HtlUgKG73RttFiT8hFDQR4g3FQUKfJaWp1wulpEQMFgdOlqcWODIk6gQJoBIloHhlSjhurPXtG2nQ4JU2QjQxpzRhYoaCvGVK///vmU3hjw0k88sZW3Tnp923YxDZsGqHRR4p0DtGR8TiN3Tfd8KOAqwAA7BfNxZCd3zwiNhRkI4iuDX3FiZgIGgOFlmynYCiGDLY1qxnS7tPj5HXtjY4LAE4b+fMcExlSTtlot6zQ0EZwFKGjtBF4TheZ8Qfl98Y1QyGdqQGgNmrQ7k8RcABQH46esWJG2541x9D2QRGabAE3G2kJiZIuMsWijcpU1cV2j2yNNLlk7Ycg2gMzB8yh3BkInIRLUhqqkGm6vdmDIcI+LU2zJQiic0BpckRMWpomVzgwCyNy05GfHS3MFwzT5PTbmltrq7d3h+ct4pMcGeI5DhnheZKUp7O8UWRIlSanFi5V4TmOlLQ2p2AzTS4oGi5n09ZiRXrqmoPISnVpaoZg2l4bGTJKk9NGhmLZYWvfx7uZaA0DhWS4yRFEe2EWGVJS5A5I+Yhl+kyRoeRBupIgujYkhoiYsMYBdnLQnQKPlT9QT1LpNLiiGNcMGe9Te3x3JDKkT8nTYqdmSOCBh78yCF6XgDvCcycZ9TPWPENfHL6AR28YGonkOOwaKARCaPDrjczNxIn2fZ0voFsW0trPMadkJTKknuNInYYWz0Ah3s1EqDVqhkRzsUYQHR2zyNAIPiyGNOYJWkgMJQ8yUiGIrg39WhIxseLUZgbHcXEvIkarR+Zl6BcaHF+5WWBvns0clIwmJDWD5zgMzUnDz28bjd7p7vAyfTvVPENh0ZDukZ8vbDx+Ec2BUOQm3yEYiKGQuRjyh+JHhrRpauz+FZOJ2JGh6Elpj+U1MlDQRMJiRV6052oUWTNrr414tRR2N1YmWCWIjoSpGAo7yR2QBsTcngwUkgdFhgiia0ORISImrBhqDUcdI7H045tHwCnw+OoE9fxD2qiPkibH3vQKpvMM2RNDVpapDBTCr0fmpePEhUacr/Nh15maSC2Rg+d1YkQRGs0mbnJGkSE2nU0rOFjho9QMaVPbWNhTYuduAoyttbU1UioxFsddLh4hi2lygZCIH7+7E1MKMpESb58x0vgIoqNjmiYXjgyx5glDc9Ii8wspGE1yTbQMigwRRNeGfi2JmLBP1M1S0KzvS4/RLtM9Tiy8fTQm5GeqlutrhpT3bGQoGWLIaFnseYbYWd9H5KUDAI5W1Udc5hwCp0v/ihUZ8gVF1WSr2m0AfWSIfa8IqWCM9uwZ1TSpJ2tNCZsxmKXlBYKiOg1N00/tucYT0myWYSzjg//dchrvbzuDn7y/J+b+AG0dEqkhovOTgXr04S4CAA5J0TS5MX310XSKDCUPGkmC6NqQGCJiwoqIFGdiHxej+1E7Lj1mNUOqyJCpGGqZLXisZSGDehyHwGFIb3nC2iNVDYxIsj/paqMvds3Qbc+tw9pDVYb9UdrFmmeIbV/brBZDUWtt4/Q1f0hUnU91vV8lvOzWDFmt77nUGDBfqd1nKzjUEURbobXrB6IpcqelXqhD1JxmdB8SQ60JzTNEEF0bSpMjYpLqduDpe8YBnByxSTZ2Mjn0NUPyDTt7nyuYXLTs1AwZpUQY3cyLkoQ3N5zEB9vOYMaY3Egfh/ROBSBHhsb2y5SXC7xKyABMmpyBhbYvKKLBxGVOodEfwrde2ojjT90KQC12/BbmGWL3pYsMOWO7yQVC6pqhP5YdQvmB89Fjad3kmPGTJEk3xqwbXyzhYueeRJSMXxNEZyBg8KFVUuQOaswT+mbqk0YpTS55kBYiiK4NiSEiLt+4Ss5NDwSsP5U3wqiI3c4TN33NkHyxH9w7Ff0yU5DpdZoW6idaM2QkkEKihJ++vwsAcOh8XbiPPAaHI0NHqxowKvzE1slz0I6eIlgM5xkKGBsoGE3EqiDGiwxpbq7YeqBaXZpc1E1OES+sG50/KEJrTrfzdE3kdaw0uZAo6Z5as/tKmrW2gUNdspzqCKK1MY4MRW21s7xO3DquD8b3zzR82BPPtISwDkWGCKJrQ2KIaDMSvQ81qxlyCjzWPH5DzAuWmRhyCbyqDgeITrQaDzYyohgQOHgOg8ORoRMXGyNCR+B5PFY8GOUHq3Blfg98vPd8nMhQfGvtWP1RhE4oRs2Qas4izd8mhSneDoQkuBycygDCH4rtJqebZ4j52wRFCQ5NbbjVSVeN/sJ//ewI+mam4LZxasMNVvgoYovdNQkjoiPDpqimexy4enBPDD8cdpIT8+EQePz6zrEAgNVMVJZIPhRkI4iuDYkhol2x88RNG01g3ZYccRSMac2QwWKrzkFGFtCCwKFnqmzHHRIl1DYFI8fvn+XFxp9Ow4FzNbIYCqsLo2iPlUlXtajEioWaIa0IZFFqhpR2LgevSmXTGiho0UYB2YfUgZCoc8qyOs+Q9k+z52wtfrtiPwDoxJDKTS7cH6odIjoLbOTWHxQhABjJnQQgR4bY75SdedQI+1BkiCC6NvQLSrQZVt3kzDCbZ8gKZjcLRsc3qzvSwmoJZRMHz8EpcJGUPmXyU0XIcRwHl0N+HY0MGYuheDVD+v6ob54A4zS505ca8f6204ZiS8HDiKFAUF9/5A+JukgTi1ZzsDcT2glqAbVIafCH8PnhatXNoBlV9T7TdUZ23VQ7RHQW2O+JPyQiW7qAHlwjghKPI1Jf1XfKTk0kQRAEoYYiQ0Sb0TvNrVtmZ/4GXc2QyTwcRpilyRm52VlNiWBv4OX9SBB4eaJZr1NAnS8YiQyxKX6KMPOHb3bM0uSMhFrsyFC0Pz4jA4Vwf6//fXlMIaP0UeA5hETJ0IwhEJJsTbrKRnsC2mIjzb6fLz+C58uPYP6NQ/GjmSNU7bR/L6uCTOkP2694QaIjVfU4pJm7hSDaCjYS2z8rBf0DBwEAx6Q+8MOpFkMUGWpVKDJEEF0b+gUl2owZo3Pxna8MwnP3TYwssxcZMptnKD5mT06NrnFWL3xGN+JK9EoxILjU6NcdX3kdEuWJS40iQ80BEQ2+2PMMaWG7E4kMhfSRoXhCCJAjWRHRZhQZipMmp+0mG6EyigwZ9WnZ2qO6Zdo/DaurtOl16tQ79f/x8AVDmPZfa3ST0RJEW8HWDL344FXo5zsGADgQnl+I/S5QZKh1IS8Kguja0C8o0WbwPIf/vG00bh/P1nYkMM+QjRsAs8iQkfCxKoZUk6KGNxHCgk0RQ5W1zQCAHilRW3L2Ka4/KKLZoGaowRdEo8n8Q2YYzTPEps4ZBGRMUdL9gKgAC2rT5GIoi6DmYGxEJl6anB3Y7bSCymieIbbP2j9zkz+EH72zA6V7K3HucnOL+kMQyUL5Dv33vRMwIi8dff1hMSTK7p5spJzEUOtCkSGC6NrQLyjRrti5xmhredxaS7IYKHU6Vo5v9cLXwEyKqmwRiQyFU/iq6+XIkEoMOTRiyCBNrq45GHfSVS2sGGgKhLB09WFsOn4pskwrUGIh8Hykn8ox2UhQwMBa26wv8vvo6/KD53X1QEGDyFC8P4MoaURWTDGkX6bVX8s/P4Z3t5zG3P/ZjHM1JIY6I0uXLkVBQQE8Hg+mTJmCjRs3xmx/+fJlzJs3D3369IHb7cbw4cOxYsWKNuptbAJBZcJm+XvYJxwZOijJYojS5NoOO+ncBEF0PqhmiGhX+vbwWG7L8xx4Lnpj63a2TmTI6n1FPSNWlOiJoEmTU2DFEGsE4QuFDNPkapsChqljVsXQe1vP6NfbCL44eC5yE6bsVxsZihXN0YodNkK18B97UFnbjMdnjowsi5Vyx8LelIgSwDOb6SND7OvwPEMxBFxVXdSM4ezlJkv9IToOb7/9NkpKSvDCCy9gypQpePbZZzFz5kwcOHAAOTk5uvZ+vx/Tp09HTk4O3n33XfTr1w8nTpxAZmZm23feAKW2ziFwgBhCru84AGB/WAyxP112ouSEfUgLEUTXhn5BiXbhpYcm4dZxfVAyfUT8xgxs3VAy0uSMLnJWnwKyYkjRBYrQ8cYQQxzHwcHJG/iDInzhyNDPbxuN710/RN63PxipN2KxOs+QEVYFByCLOiUtURFB2nmMYtUeaVPhtDVE/7P+hHp9C9LkREm9nTYypOqfUWRIsz/Wfp3EUOdjyZIlmDt3LubMmYPRo0fjhRdegNfrxfLlyw3bL1++HBcvXsQHH3yAqVOnoqCgANdffz3Gjx/fxj03RvkOOQUOuHgMTsmPJsmFU5Is7MhNru3I8DjjNyIIotNCkSGiXZg2KhfTRuXa3s4hcFBKdeykyWltuRWMlrYkTU5BENRpcgqsGJL7AwRDslGCElW6c0JfpHkceGHNEUiSsY12LGvteGInJEqWJxqVI0NhMRSZwJVxqwvGrhkKaIWJpq3WGdBqBh+7lSgBnIF1eHS9vmYoVjSLvaE8Q2KoU+H3+7FlyxYsWLAgsozneRQXF2P9+vWG23z44YcoKirCvHnz8I9//AO9e/fG/fffjyeeeAKCoP9t8fl88Pmi0cPa2loAQCAQQCAQsN1nZRuzbQNKfaAkInhuJxwADkr9IYafYXKQotuK6ujyL24f1aI+dUbijWMiPH33FXhr82n8v+IhXX48W3McuxM0jsnByjgmc4xJDBGdCvYmOhmpIYmkyRmJoaibnPqrpRND4cPWNUe/zB6nALdDgMfJG9YRAcaRoWBIhEPg40eGJCmmGx2LHBmSB0JxtWIjL4GQFMdNzjxNDtCPuxWHO0AdyQtJgMS61GlNG5i3UTEUXaYdLjZ6SGKoc1FdXY1QKITcXPUDltzcXOzfv99wm6NHj+LTTz/FAw88gBUrVuDw4cN49NFHEQgEsGjRIl37xYsX48knn9QtX7VqFbxeb4v7Xlpaarj8Uq0AgMPWTZvQt/FDjARwUOwfWV9fXx+pb5K/1vJvzkPDQsiq3oUVK3a1uE+dEbNxTAQ3gIf6AZvWliV93x2V1hjH7giNY3KINY6NjY1JOw6JIaJTwUZ47NQMmZFImpzRpKgRNzlN3zIMIkMAUMtYN3vC0aR0jxPNAePJRI3ETHNQRJrAqyI3RoREKeZEq+r+8ZGxVoQKG1UJBBNLk9OKISMDBSNUcwchGrVi+xl5H8dAQSseWTGkuAASXRdRFJGTk4O//vWvEAQBhYWFOHPmDH7/+98biqEFCxagpKQk8r62thb5+fmYMWMGMjIybB8/EAigtLQU06dPh9OpT8NacmAd0NSIr1xzNYZv/jtQEa0XAoAeGRmYNasIgGwrX7JBvmkovHIibrkiz3Z/OivxxpGwBo1jcqBxTA5WxlGJzicDEkNEp0JQ1QxZT5NL8xh/1I2CKVZrZWNFhrxMZCjd7dClhSliqKZJjgw5BS7SJsPjUBXzs2iNCQDAFwghze2IGxkKSRKaDMwajBCEaM2QUshtx1pb209tepo2+maUvmakj7QOcWykTCvA1M5xRpOuqtuzjlyx0hGJjkevXr0gCAIqKytVyysrK5GXZywM+vTpA6fTqUqJGzVqFCoqKuD3++FyuVTt3W433G79xNFOpzOhmx6z7ZXvm8ftAl8lR7cOMmJI4DnD7ZwOR7e8CUv070DI0DgmBxrH5BBrHJM5vlR1SXQq2CJ3j43IUJ8eKfjPW0fpll9o0JsUWK3lN4pmKILGw9QMaaNCAOAOd/1y2CTB44jdXsFIIDQbTIpqREiU1HMjxUDlJhdSJmuNCoRAKLa1tnZstEJFa5MeNBB5/qCoSwtkzzEkqSem1NUMiUaRIWa9VgwxaZdWx4noGLhcLhQWFqKsLJrOJIoiysrKUFRUZLjN1KlTcfjwYYjMB/ngwYPo06ePTgi1B8oDBafoAy4eAQDsF6NiyKy20UE22wRBELagX02iU6GuGbIeGQKA71w7GNmp6pucvAy9tbfV+hUjjNzktPVCAKDouIthMeZmxZNN5yJfONoTb+JSO2lyAmugIIpo8ofw5ZGL0WPGMVCIFaUB9KmIZmOujb4FxRiRId1Er/rjswJJq79UYsgg6mfVfIJoH0pKSrBs2TK8+uqr2LdvHx555BE0NDRgzpw5AIAHH3xQZbDwyCOP4OLFi3jsscdw8OBB/Otf/8Jvf/tbzJs3r71OQYXyWU+tOwpIIpocGahCZmS91hPmwaKBmJCfieuH927DXhIEQXR+KE2O6FSw96PJMFCYfVU+huakYUJ+Jq59ejUA6/UrRgi83k3OSAy5BAkAh0thMcRGuWJFhoxQzBbM+t23hwdna5ohijbS5DgmTS4kYd6bW/Hp/vOR9XJkKIYY0ggT7Xte86czE1b1viCyGAGrjfaw6XixrLWV3bOH0Yob9ubSqB5Mkmi+kY7M7NmzUVVVhYULF6KiogITJkzAypUrI6YKJ0+eBM988PLz8/Hxxx/jhz/8IcaNG4d+/frhsccewxNPPNFep6BC+WynXJJT5Kq9Q4H66AdQ+0Dhl3dc0XadIwiC6EKQGCI6FazLV1aq/VQW9vbhxhG98d3rBiPVrf4axIuwxMJhMOlqptc8Te5io1wzpEqrM6lvMsMXDEGSJF1638i8dPzlW4Woaw7itufWISRZT5PjNZOuskIICIshG5EhbRRGmyZnFhmqa1ZHaLSmCKyhhPaYkqqtvmZIZ7gQp0woJEngLVeUEe3B/PnzMX/+fMN15eXlumVFRUX48ssvW7lXLUP5PKdcOggAqPYOUa03mS2AIAiCsAmlyRGdikkDswAAPywebjqRaizYe/CX50zWCSEgsTQ5IdwnNk1uWE6arp2yOlIzlGBkyKjPGSlODOyZGolWhUSgya9P/zIjGhnSq4TdZ2qx56y5k4vOQEHURmGsucnVa9LVRE3NEJsmF8tNTnlp5DAXfR/fmpwgWgvtd0SJprou7gMAVOnEEKkhgiCIZECRIaJT8fTXxuFgZR1mjmk969hk1AyxaXJj+2fq2rnC2ueSgYHCyLx0W8fcdPyi4XIlPU8RQ6INNzkAqsiQEUtKD5puqzNQ0Ioh5rG2KOqjWgqKWDTaj6gxUNAew6hmyChaZPZei9WJYQnCLqcvNeL259bh3skD8MTNIyFJUuSz7aw+AACoThms2obEEEEQRHKgyBDRqRjcOw03X9HH8lxAeuJvl1BkKHyTz3ZvbL8eunYRMdSgT5O7fVxfFI+S6xz6ZabEPeaS0oO4b5k+1UcRQ8pNUzAk2nJJU4RdoAXjEc9AgU2Ti2XEcPqSevLTWGlysd3k9JOuipKE2uYA/rnjLBr9wZg1UPH6SRCJ8Jc1R3GpMYDny2XXOEXYZ6AeQv1ZAEBliiYyRFdvgiCIpECRIaJbYUVDJSMy5GDuVHIz9HOTKGlyFw0MFHiew7IHC1FR24w/lh3G3zaebFFfFDHkiESGYNlNDoimyRnZXsdDa5igHVP27xBrvI9faFC9VwkcGLvJiaKEZ1YdUG1rNOmqKEmY98ZWrD1Ujbsm9sMVBqJVdWwbYsgfFPH5kWpcVZCNNINUTIJg0ab8Kg8ThnOn5QUZ/eET0gBUgiAIgkgudJUmiDCzxuZh/ZELuHms9RS8cf17YOfpmsh7JTJ0w4jeePgrg3BVQbZhFMvFyzc7Stoaa60NyE5RfXqkRIRMS0gNK65ozZB1a20gKqJaIg5FSRYlvMk+2BQfo/17nDyaAyKOX2hULWdT4UIaNzllPx/trsCfw0/YFSKTrjIaTZSAtYeqAQDvbzuDMX0zYp+TxXF4euV+vLjuGPxBEVcPzsZb3zWe56YteH/baWw9cRlPfnWMKjWR6Fho50xTJjoeyZ+SF+SOhgSKTBIEQbQGJIaIbkWs28Gl91+JkCjZmrSwb48UlRhSIkIOgcfPbxttup1LM0WSx2TOJCGBG1hP+CARQSJJaLRTMxQeh4Am5W1oThoOn6+Pu31AFOHm5T5oBQ8bOTIyTxiem46dp2twIlZkSOLUbnLhdacuqQUUEDVQUEWGYlhxG2FFC52vbVYJsS+PGtdzsdQ0BQzt15PBD9/eAQAoGtITs8b2aZVjEInj0TwM0UWGckYDAfU2lLVJEASRHCjrmOhWxEqT4zjO9uzt/bLUNT1WxYtLcxjtk2G7+zNCMXFQ6nNEUcKFep9p++G5afjT/RPx4fypAACnoER11ClvXq2SM4GtG9LW27ACyyjiMjxXNpE4falJHf3R1AypDBRCevvsaFv9Or2BQoyTgbUIWW2zdbc+QK73Gv/kKpTubd30p+oYf3ei/WG///6gGElNjUSGckbr4kKkhQiCIJIDiSGCSIC+GoMDq2ltejFkLDDspsmx7RUxpJQvhSQJByrqYmzL47ZxfTEu7H6nCDFtZMiyGGJT2jRCQl3ro7+t65eZAreDR0iUUFHTbLifkM5AIVozpCVaMwSmvbZN4tbadtIQAeCPZYcAAIv+sdvWdnaxmuJHtA9uJjLc4AuGTUskDOeiaXK6vyH9SQmCIJICiSGCSIB+mR7Ve0GwJl7c2jQ5k8iQ3ToPtr0y8asSGZIkYH8sMaTpu5LypzVD8LqsZdcGYzi9GdX6sHicArLDk+pebgwYthUlY1HVHNAbPkgGkSFJGxmKmyYX/+6z0cY8TiwpFgVmSwnRjXOHhv0s1vuCCARF5OISMrkGgBOAXsNJ+xAEQbQSVDNEdCs4C9badsjNUIuhFkeGTGqG7EaGWMvqYTnp4X1ED+YLqoWC28FHlmmPpbzXRm6sRoYCIQmvf3kCL6w5oqtvMEt9U3A5ePRIceJcTTMuN/mx6fhFvLXxlGreIdHEQKGmKaDbn3IKsecZin0+VtLk7NRksbS2GNIKP6JjwX7H6pqDcDk4jFBS5HoOBRxu3XeIDBUIgiCSA4kholtx15X98Hz5EVzRL7ZzmFXcGhFjuWZIUN/ImKXJ2Z1YUeA5vP/oNaioacbosDtarPlIvC6BEUPqhkr9lHbOIOtiSMTHeyp0cwXJ65h0N4OwhcvBI9Mrmwpcbgzg+3/bqGujiwyF93PZUAzp5xnSHjbePEJW9ESzzTQ5BTMxnCwSsYsnWh9WDNX7gkjnHBihpMjljAKgFz+kbwmCIJIDiSGiW/HD4uEY3z8TRYN7tngf+dkpaPKLmDEmN2IyoKAVFGZYNVCwGxniOWDigCzVslgCzety4FI4DU3bdeXcmjTRDqtpcr5gSBeJUvDHiQy5BR6ZKeE0OQNxI29nPOkqGz1SUO411Wl22pvLOJOuWokM2RBDbBph66fJ0Z1zR4b9bDX4gkhxChjBh53kcscA0Isf+osSBEEkBxJDRLfC5eBx8xXW5xEyomeqG+/96BrwPIfj1Wrr55a6yWnnGVKwWzNk5IYXK7qUyhQvaW+2lHNp8KnrYKxGhnxBURW5YQmEREiSBI7jdG51gDoyVGMgboDwpKusm1yMNDkrNUPxrbWTmybH9lMbYUwGKhtyigx1aNh0zzpfEOCAEVx4suVwZIggCIJoHchAgSAs4goLjalDe0ZEit50wGqanPq925GsyJC+vXYf7NsUJsqjvdd3hs+3wae+wfc4hZgW5Qr+oGgaGZKkqHgxcpNzOXj0CIuhS43GkSFRAgJBvZvcZYP2yrmx56gVP/H0gjU3OesGCpcYkRfQWtslgQAjMkkLdWzYVNT65iCOVtZgGHdGXpAjz1emFe9UB0YQBJEcKDJEEBb5pOR6rDl4Hl+flB9Z5tREYlo+z1ByJl01miZJ4DnwXPSG2OtyoD4c7Ulh0vO0N/tmkSGB5+ASeFOho+APivAHzSMlgZAIp8AbRmRcTJrcxQaTyJAmTS5WZMh4niHjNmZY0St20uQu1EfPS5uKmAxUNuSkhjo06pqhAGpPH4CHCyDAu+HMKgCgT4ujvyhBEERyaFFkaOnSpSgoKIDH48GUKVOwcaO+uFlh2bJluPbaa5GVlYWsrCwUFxfHbE8QHZUBPb34VlGBSrhoxZA2UmSGW1BPAGsmhji7BgoG7TmOU6VhsWlubP+1dSVKRElrF+3gOdNIFosvRmQIAAJB+XiGYohJkztxoUG3Xu6vRgyFJIRECbXN1gwUtKlj8VLJQqKEH769Hb9bud+0jZ15htjIUHMriCHWpIKiCB0btn6svjkIqXKv/DpjGMDL31ddzRD9SQmCIJKCbTH09ttvo6SkBIsWLcLWrVsxfvx4zJw5E+fPnzdsX15ejvvuuw+rV6/G+vXrkZ+fjxkzZuDMmTMJd54g2puWpsnxHJDujgZmPRbEhRXM5jliDRrMxJBWCyjn0qC5wRd4zrTGicVvUDP02sOTo+vDN4BmaXKZKbIYOn6h0XD/kqS+4Q+KEup9QcObRGWZOjKkqRmKc3d5oLIW7287g+fLj5gKJzuRoYsNUdFmd7JWK6gnqKU7546MylrbF0RqjTwZL8fUC1lJ0yQIgiDsY/sObMmSJZg7dy7mzJmD0aNH44UXXoDX68Xy5csN27/xxht49NFHMWHCBIwcORIvvvgiRFFEWVlZwp0niPbGpUuTs/6Vygjf7APmkSG7GEWGtPtn3eBY8aaNHjgiNUP6NDkrkSF/SFRFbpRtlTFT6mSMhIXbwSPTGztNLiRpJ3YVTUVFJDKkmbSVxc69Zp3PuDbIjhhiI1itkSbHjk2AZl3t0LATGx+takBB6DgAwJs/LrL87iv7t3W3CIIgugW2aob8fj+2bNmCBQsWRJbxPI/i4mKsX7/e0j4aGxsRCASQnZ1t2sbn88Hn80Xe19bWAgACgQACAeNi6lgo27RkWyIKjaMeSXOzL4nBuOOjrM/wRAWKgxMNtxNFezfJPGf892HFC1snxAaSQqK6Dzzkc9OKIUgiXBbSARub/fBpbvIlMQSnwMEfAhp9fgQCDjT79f3lISLNFfsYQUktaPyBEGobmw3bhkQp/PsRPZeg5m8XiFHfBAAhZv2FukZ4HV5dmwaf/lzMPg/NTPphkz+U9O8VO65NPuPfTivfafq+tz5sFG/LiUtYGJ5jyNVnTGR54cAsrP3xjbj26dUAqGaIIAgiWdgSQ9XV1QiFQsjNzVUtz83Nxf795nn0LE888QT69u2L4uJi0zaLFy/Gk08+qVu+atUqeL36GxCrlJaWtnhbIgqNYxRJAjgIkCDfuH9WXo4st7Vtg421UIKzX36+Foc9+jZ7z3EArEeNGhsasGLFCt1yf5MAhPvYUHMxctzKinOR15cv16q23XNePnZ9cyCyLQDs3r0HvkZetcyIzdt2wBdQt9u04UtIotyXsk/LkecFDtboz/HLz9eFhZr5T1RAVB9//8FDcFUfMNymsbERK1aswM6L0WNVVVeBDY4fP3ECsYLlm7ftiGz70Sfl6J+qb3PiDK/bh9HfAwD2nYy2rW/ymbZrKdXNgDIWh4+dwIoVx0zbxvpONzYapykSyYON3AV8jShwV8hvcseo2uVnM9c/SpsjCIJICm3qJvfUU0/hrbfeQnl5OTwegzu/MAsWLEBJSUnkfW1tbaTWKCMjw/ZxA4EASktLMX36dDidzvgbEIbQOBrz482fRGpjphdPQ056bDWkjGNB31wcrKkCAMwsvgm5GfrvxPn1J/D+8QOW+9IjIx2zZl2jW7781AacbawBAAzsl4f9NXKN38D8fth64RwAIC1dvW1wxzm8cWQXRI3oGTFqNA4HK3AmvD8zho0aA/Go+iHJ1GuuwZsndqCxzoeiqddiVJ90pB+uBvZuVbUrvukGcBzw6+3rTPevzSwbNHgIrhzeC9i1CS4Hr6pX8qSkYNas6yDsqQQO7AAAZGf3BGouRdr0z88HKs1rGUeOHgOEz2ds4RTDiXtfP7cJuHxJtWzWrFmG+9uz6iBw5jgAwC9xuOWWW2IaZihpjFZNNY5VNwDbPgcA5PXth1mzxuraWPlOK5F5ovVgo5RDubMQOAm1XDoy0nJjbEUQBEEkA1tiqFevXhAEAZWVlarllZWVyMuLPZHlM888g6eeegqffPIJxo0bF7Ot2+2G262/oXQ6nQndhCe6PSFD46gmw+NEdb2c1ulxWR+bVE+0XXqKx3A7gY8dFZoztQAvf3488t4h8Ib7SWFME9jjuhzMPEOAalu3y/jngeN4SzVOjX69k5zb5YyYNoic3FeO0+8r1eOOW/Qf0Oxe4jj4wssG9UzFgcq66DpJPjdeiB5LK/LilVAGpWj7Br9kOM7N2k4Bpp+HkMTWawEiJ8Qc1zkvb0RlrQ8fzp9qOLmuDuazExDN+6H00Ww9fddbH9ZAQZls9YxrEDJiieNW7xVBEET3wJaBgsvlQmFhocr8QDFDKCoqMt3u6aefxq9+9SusXLkSkyZNanlvCaID0iOFNSSw/pVi63jcTuvbsYZ1i24fg2e+Pj7y3mxeIvYmO5U1UBDUN+QsZucSkiS4mL6Pz8/EgltG6toZmQwIPBfZVjFQMLPWNjODUNBqrWBIihgo9EhR38Arh2AdubSGEfHculibcKO5jAC9DTkAbD91GV8evaBbrp1oNZa9tiRJWH2gCnvP1WL3WWuRGnb/Wlc/omPBTro6nD8NALjgHRJzG8qSIwiCSA623eRKSkqwbNkyvPrqq9i3bx8eeeQRNDQ0YM6cOQCABx98UGWw8Lvf/Q4///nPsXz5chQUFKCiogIVFRWor69P3lkQRDvCusKZWVsboRJDNqy1tVEB1jabN3OTa8E8Q06TcwmJkmreomuH9sKMMfrIcJ3BfD8Cz0X2GwjGttaOpyu1QZigKEbMHthIGBAVOtqJSNnhiheJYgWF0VxGgLFF9p1LP8e9f/1SJ6C0YsjMUW7l7nORonm539aEDXuuWlc/omOhfAf6ZaZgZNg8oTZjWMxtJIoNEQRBJAXbNUOzZ89GVVUVFi5ciIqKCkyYMAErV66MmCqcPHkSPHMX8/zzz8Pv9+NrX/uaaj+LFi3CL37xi8R6TxAdADYKYXWeIUAtgOxMrurkObBm06zQMY8MsfMMRb/2Am8eGTLbV0iUVJEsnufQ26BOqq7ZIDLEcREBpkRaDCNDAg9fnDHRiyEpIihS3VoxJP/PnqMoyf0JhhfGe9JuKTIUI7pT7wuqPiv+oPqAZrbg33tdXU8VtGiTzRbl+wzS94iOg2KtPTIvHcOPyWKoKWtEe3aJIAii29AiA4X58+dj/vz5huvKy8tV748fP96SQxBEp4G9wTUTEEZYiQYZ6QGngweYG2dWmFhJk2MjQ2yanDZNzGlSlxIUJVXfeQ5IdelrXQzFEM+hf1YK9pytxcHKOtw4MscwIuMUuLhjqU2TC4UkNPjkcUlxOjA0Jw2Hz8sRaCUlTpsmJ0fS9FEjw+OZiKFzNU34j79tw0PXFMScZ0ibqmY1MqTFKJJmBEWGOg/K32p8bwl9j1+UF/YeFWMLSpMjCIJIFsmZ9p4gujEZjCFBvDoXFu2ErVbR1vKwQsfSpKtM1MTJ7EsrhszEiKgRQwLHGUa2zNLkCgdmAQA2n5Bd14zSvjiOAx9HDGmttYOihKZwzU6qW8Cb35mC2ZPyAUSLzVkdEZLUaXLxaob8oahYqWmKCr3f/GsfNh2/hPlvbotZm/PSuqM4caEh2n8bNUMsVsVQkGqGOjR/23QKy/bz+OfOc5HPwgS37Ox4RuqJ9Ey9WyELiSGCIIjkQGKIIBKEjQzFu4FnKR6VAwDo08PcZt4IbQoYe3yz6AYbPTIzUHBqRJZpzZCkrhkyO+d6EwOFwoHyhMtbT1yCJEkwC1rYNVAIiWIkMpPiEpCT4cHc6wYDiAodVvCIorrGKq6BQsA4MmSWMqfl9S9PYtp/rYm814qhWFElFu1ksabt2MgQiaEOx4GKeuy+xONoVUMk9bFn/RF5nZiPgl4GE1kxkBYiCIJIDiSGCCJBtM5lVhmak4Y1j9+A0pLrbW3n1VheD+2dFnm9UUmx0cDWFaVoDBSWfGM8cjPcePbeCaptzNzkCnp6LaXmmaXJXdEvA06Bw4UGP/aeq8Xz5YcNt9fu16tJxTOqGWoICwpF8Cm7EEWlLih6C7n3XK0qNS2eLwGbalbLCCA7qZEqgaKp/Wn0h3QOd0b4LAqbIHNClCbX8VA+NyFJinwuMuoOAQBGjJ2M4bnp7dY3giCI7gSJIYJIkIyUls9dPLBnKtLc9rbX1ufwPKcySDDCzFpb4DncfWV/bPhpMcb1z1Rto73Jf/grg1AyfTi+VpiP3mlRwwQlgvMf02T3q+uG9wZgbqDgdgjISZejYfcv24AjVQ26doDeGS+eGAoxaXJKW2UfisaIpQniucn9Y/vZyGs20mLHNIMloBE1u8/UYNKvP8Ff1hyJuZ1ZOt3JC434185zEUHFGi1QZKjjERFDohQRrum1BwEA/UbEn4LCinAmCIIg4kNiiCASpFea3kmtNfEaiKd3/v0apDgF/MRgvh9A7SbHRoZi3chrDRRmjsnDf0wbBoHnkJMRTe1T0uRKpg/HjkUzMOsK2WbbLE0OAHqF3edipZhpxZjWLls3zxATGVLaKnrKKE1Oi9X0M0CdjmgnMsSiTZN77tPDuNDgx+KP9sfcziwydN3vV2Pem1vxr11y3QkbhfIFraXgEW2HSgyFJAASUmvkyBByYpsnEARBEMmj5Y+0CYIAAFw/vDduGNEbI1ohreWWK/rgyX/uVS0zcm4b278Hdj850/TGnBU9bM2RmWMcoL/Jz06NpgPmpLORoWibHinOmBPIKvvsbSAgp43MwcVGP4pHyTb92lNJcWoiQ5r7+5AoRSIg0TQ5eSdRa21zMWQnlYxNQbMz0S4AnLrYiKp6X0QM9UhxWq47AuIbLWw+fgm3jeurEUMUGepoKBFVOTIkIReX4PTXAJwA9Brezr0jCILoPpAYIogEcQg8XpkzuVX2ndfDg12/mIF/e2UTNh2X3dceuWEIPtpdgWkjc1RtY0YomJQzr9PYQEGL1kAhOzUqYHKZyJD2uC5BL9YUlCiS0bxE6R4HXvr2VUyXOfBcVMikaGqlfBo3uUBIRINfPemqctohScKWExdxocEPM+ykkilC453NpyKRGKsoE6gqjnyZXrtiyGLNELnJdWgUDR2S5L/VCF6eXwg9hwBOe6YqBEEQRMshMUQQHZx0j1N1MzuufyZ2LJyBdI/1ry8rG9h0s1iObazI4Ti1UQQbGdLOj+PSzJ/kdQkRpzRHDDEkGERYHDwfidh4neYiC1BqhrQGCvLx/EER9zy/Pub2tsRQSML/7TyLx9/daXkbLUq0JjPFiRM2tosXGVL+pEHNPEOSJNma3JdoXRyRNDkRQVHCCC4shnJGW9qeSoYIgiCSA9UMEUQnQBsN6OF12rLxZu+B2fmNYt0bsyl0kqQWR6lM3VJ1vTraop1MNsvrirxWxImxGNL3gdVHrIFCboZ++6AoRUwblLmUtCYMsbCTSnbmchMW/O8uy+1jkWHTjbA5Tv0PF5a+rIGCJFmfn4hoG/hImpz8txrBn5ZX5I6xtL1E5toEQRBJgcQQQXQCtNEXu3BMbIgVGLEiBayIGdjTa9quus6neq+NDLHzKCmCKsdiZIiNXLERrTF9MnRt/UERF8NpcL3CKX12vA3sppLVGRhEtIRMZpy1GM0b5QuIMWufIqmBTF3T1KE9TeegItoHh8pNTsII7qS8gswTCIIg2hRKkyOIToDVCTnNYDUPW/AfSyu4HDxW/fA6/HbFPtwSdogzIjtVfTOvFUNDeqehsCALKU4hEm0yigwZOdux0S/WQIG1I/c4eTQHZCGkiMaeaXKf7KSFtZfJQGaMyJCRQPt4TwU+2H4GT98zDjPG6P8uFbXNmPGHNZFI0O3j++K5+yYmr8NEUlA+218cuYCL9U0Y5j4jr6A0OYIgiDaFxBBBdALi1YnEo3hULhZgF8bnZ6oiQ/HSyIbnppuaQ7w5dwre23oG828aqlquTZNzO3ksuEX9tLtXqlFkSN8XdhmbJpfmib7O8DjRHPDh1KVGALI4is4zZNh1Q9prYtJMr7EYOlRZZ2hPfq6mGQDw3de24PhTt+rW/2un2tChpfMgEa2L8nc5W9OMQVwlPFwAosMDPqvA0vakhQiCIJIDiSGC6AQkmibXO92NXb+YAa/GkS2RevprhvTCNUN66Za7NMU/Rvbdmal6AWAohpgOelzGkaGMFCfO1/kiT8p7projESE7kaH2clzrYRAZqm0OYPofPkvK/kkMdUzYqOfwsHlCMHsEXHxsoxAFmnSVIAgiOVDNEEF0ApJR75HucULgOVW0pDXMxRwa8WNk353uduhu0uOlybkd0ZvEVEbUZWhc9XqlsYYNFjuN9puYNMugZujc5eak7T+WfTrRfrCf95GKGOpF9UIEQRBtDYkhguhmsNESLmbVUMvQihqngTECx3E6FzWjKA4bGWLT79IYAaSNrPRkJnTtDJEhozQ5u2mRscSy3UlhibaBTVEdHp5jSOxtXQxRXIggCCI50FWSILoxrREZ0qbFmUUmPJraItb9TEHgjcUQWz+U7tGIodSWRYZaEnwzq/dJdB9WxBA7NoEY9U4xJ+Ml2g3BIDJky0mO1BBBEERSIDFEEJ0A5QZ/cO/UpO63NSbh1Iofo5ohAHBrJlE1isywQQ3Wta4HI4AyUtRpcmxkyM48Qy0hlhOcVXqk6NPkmi1EqdjarFhiyElpch0SRQy54UcBVyEvzI3vJKd8pCcOyGqtrhEEQXQryECBIDoBf/vu1XhhzRE8Nm1YUvfbGrfJ2rQ4swJ+reucP6R/1M2myWV4nPjb3KvBc0AwFHVZky27OQTC26trhlpXCPTwuoALjapl/TJTcOZyk+V9tDQyxFqYBw3GTsFo/iai/VE+20O5sxA4CZekNKRk9Im7XekPr8eHO87i4a8Mau0uEgRBdAtIDBFEJ2B4bjqWfGNC0vfbOgYKGmMEs8iQRgwZRTdYAwWB51A0pCcAYNvxC5HlToFHilNAICyQWEOCVtZCSHNHo1v/+8g12HbyEk5ebMT/rD9haXueUzvjKTRYmNCVHT+KDHU+lMiQ4iR3QMrHJJPvCsvQnDSUTB/eqn0jCILoTtAjQ4Lohtw8Jg95GR7cNDIn6fvWp8kZ34xrJ2c1SpNjI0OsMPI4o9s6BB4pTA1RFmPb3dpiyMM43I3pm4HvXDvYVo2OU+DhdvAY2NOrGidLYogZg0CMgieqGeqYKH+XEWHzhANif/pbEQRBtAMUGSKIbsjz37wSotQ6N8r6NDmzyJC6ZsgousH2j023Yw0UXAIXnj/JBwDI9LZdmhw795E20mUFl8CD4zh8OP8r8AdFfPVP63Cuphk//8ceS9sqBGLUGJnVbBHtS0QMRSJDA1qlho8gCIKIDYkhguiGcByH1sqe4sNzGSnBCjM3OStpcqwYYoWNhzFf4DhO9T4rSWLI4+TRHIhtZMBGhlpyI+sMj4FiD66NlsXCxRw7aODEp0DRho6JEvVkI0MEQRBE20OPDAmCSDpsnZBZmtwjNwxRvfcZpclpaoYU2MhQMCSpjpHFGBIkogMGZqdi7Y9vjNmGTddrCdqxsRNdcjHb+oOx5hkiMdQREQQOGWhAX+4iAOBbd9zSzj0iCILonpAYIggi6ThV6W3GPzOTCrKx8WfTIu8NDRQ4VgxFl7OiISiK8DERnAwPWzPUciEgQUJ+theL7x5r2mZQL2tW53+be7VKpCloU9jsRIbYMqFYBgokhjomAhc1Tzgn9cSdV9uYY4ggCIJIGpQmRxBE0pEjQ7I9dCw3s5x0D9LdDtT5gpg6pJduvVmaHCtyAiEJvmDUiprX3PyzKXt2ULa5b/IADMz24v4XN+jaTBuViyZ/CKP7ZsTcV9GQnhiWm46Nxy6qlru0YshGfQ8rgGKlyZm5+RHtC89zGMGfBgAc4gYgvqk2QRAE0RqQGCIIIumwAsgsMqSw8ofX4fND1bhjYl/dOoEzTpNjCYbEmLU9PMdBlOyrIXabDJPJVR08h+9bnPvJKAVOGxmyE8kKMgovVppcS4wdiNbHwXMR84Sj3ABc1879IQiC6K7QVZIgiKTDCiAzAwWFfpkp+MZV+Tp3OQBgdZSpGBLVkSHdPlqYKjdjdF7ktZmgsOPUxvY/wyM/h5o4IFPVptEff7JVhaDFyNANI5Jvn04kDs9xEfOEo/zAdu4NQRBE94UiQwRBJB32xj8Ra2czAwUWf0g0NF+IYFMLvfGdKThf14xZY6OJS2a1PEZCjzM5YH1zdO6gTf9ZjNqmIHqluVRtmvzx5xdSCIQk5rXx+S97cBJ6p7st75NoOxxc1Fb7BIkhgiCIdoMiQwRBJB11mlzLC/hVBgomEZ7eae6Y0R+jww/ubW58kJvhxl0T+6siVWZiSDunEiAbLxhxuSkQee12COid7talxcWLDE0elB15HRJZMaQ/ZukPr8P00bkx99fVWLp0KQoKCuDxeDBlyhRs3LjRtO0rr7wCjuNU/zweT5v11e2rQibXgKDE47SDbLUJgiDaCxJDBEEkHbZoP16aXCxUBgoaVfOdESHcPi4P371uMP7yrUJkep340/0TdfswEkrj+vVQubuxxzGq2zGLbtk5t8uNgbhtmuKIoXH9euDd7xUBkCNi9/51PR5+ZZNhZIide6k78Pbbb6OkpASLFi3C1q1bMX78eMycORPnz5833SYjIwPnzp2L/Dtx4kSb9Tet5iAA4LiUB0loOxFGEARBqCExRBBE0nFYsNa2ghAjMjQ2W8KSr49DqtuBqUN7YdvPp+O2cXoTBqPIlD8kqkRPD8YgwSgCZSdNTouyu9qm+GKoMRC/ZigzPKnsxQY/vjx6EWX7z6O6zqdr192ME5YsWYK5c+dizpw5GD16NF544QV4vV4sX77cdBuO45CXlxf5l5vbdpE07+VDAID9Uj5NjEsQBNGOUM0QQRBJx5mkyBBvoWZIwcyJLd3jRG2zuhbHFxBVlT0pTBTFKJJkZnltlCanRdmfP8ZcQAohCx7gRuLuxMVG3TJ3N4oM+f1+bNmyBQsWLIgs43kexcXFWL9+vel29fX1GDhwIERRxJVXXonf/va3GDNmjGFbn88Hny8qOmtrawEAgUAAgUB8oavFc3EfAOCgmA+BQ4v2QUTHjcYvMWgckwONY3KwMo7JHGMSQwRBJB1WACVkoGDBWjseqW69KPAF1ZEhr4sRQwbdNRND2tQ9QG+goDSZd+MQLF19BHOvHWTa1zF9M7DnbK3pesBYXJ68oBdDHmf3iQxVV1cjFArpIju5ubnYv3+/4TYjRozA8uXLMW7cONTU1OCZZ57BNddcgz179qB/f30Nz+LFi/Hkk0/qlq9atQper9d2nwPBidgeyMRWcRjq6+uwYsUK2/sgopSWlrZ3F7oENI7JgcYxOcQax8ZG/XWvpZAYIggi6bARk0QMFKy4ycUjza3/mfMHRbABIC/TxigyZCR6zMjPTlG9V0RXyfQRuOWKPhiZl2667QvfLMRdf/4C1fX6tDcFI3F5UhMZ4jh7E7h2R4qKilBUVBR5f80112DUqFH4y1/+gl/96le69gsWLEBJSUnkfW1tLfLz8zFjxgxkZMSedNeIg+dq8KMD8kS+47IyMGvW1S04CyIQCKC0tBTTp0+H02k8HxgRHxrH5EDjmBysjKMSnU8GJIYIgkg6yYoMsSKkpfMFpRqIIV8wpIrfeJmUskTrNx6YMhCnLjZh+efHAESdvQWewxX9esTcNj/bi8V3j8Xc/9ls2sZKmpzbwduawLWz06tXLwiCgMrKStXyyspK5OXlmWylxul0YuLEiTh8+LDherfbDbdbb1PudDpbdNPjdke3cQoC3TglSEv/DoQaGsfkQOOYHGKNYzLHlx4dEgSRdJLlJsfe97dUpKR79GKob2aKSlyxaXKJagiXg8fC20dH3tsVcbGMDySox1bBr5lnyWgC266My+VCYWEhysrKIstEUURZtoKncAAAGDtJREFUWZkq+hOLUCiEXbt2oU+fPvEbJ4FkpIASBEEQiUNiiCCIpONMkpsci9k8Q/FIdUXF0FN3j8VXx/fFk18doxI9HkYMmR1nzeM34L1Hr7E9iand+9x4LnBOC+LSKDWwq1NSUoJly5bh1Vdfxb59+/DII4+goaEBc+bMAQA8+OCDKoOFX/7yl1i1ahWOHj2KrVu34pvf/CZOnDiB73znO23SX0H1HSExRBAE0V50vysmQRCtDqsnrNy8m+6Hed1STZXGRIauGdIL904eoNu3xxHbTQ4ABvZMxcCeqZDiG76psB0ZiuMCZ0VcGplGdHVmz56NqqoqLFy4EBUVFZgwYQJWrlwZMVU4efIkeGbsLl26hLlz56KiogJZWVkoLCzEF198gdGjR5sdIqmoxBDVdxEEQbQbJIYIgmhVErnRY3VHi9PkmCgJm7LH1tSwzmvxxYtNNdQOkSGvq3v+tM+fPx/z5883XFdeXq56/4c//AF/+MMf2qBXxqjMQSgwRBAE0W7Q4yiCIFqVZKUAtdxaOyoMWDMHVZqcM7a1diIktWZIkkVcvLHojmlynQ02HbM7mV0QBEF0NEgMEQTRqiTiJsfS0pqhFKYeyGUqhqxHhuynydlrb2Wy1HgCszumyXU2KDOOIAiiY0A/xwRBtALJd8pq6X7YSAubJseKHtZ9LdnOXsmMDCnEE5ip3TRNrjPBfs4oLkQQBNF+kBgiCKJT0NJUIlboqNLkmDZsZCjeYWwGhmz3O5YYGttfntwzJEZ70aeHR9fOaG4lomPR0kgnQRAEkVzoikkQRJeGFRdOUwOF+NbaLcW+tbY+xe3pe8YhJEm4Y3w/AEBTIBRZl5/txbmaZlV7EkMdH1VkiHQRQRBEu9GiyNDSpUtRUFAAj8eDKVOmYOPGjaZt9+zZg3vuuQcFBQXgOA7PPvtsS/tKEEQ3w259jhFuVdTH+AbUirV2tE/2OmU3Tc7ILW503wzcN3kAeANlle116ZaluqhmqKNDE60SBEF0DGyLobfffhslJSVYtGgRtm7divHjx2PmzJk4f/68YfvGxkYMHjwYTz31FPLy8hLuMEEQhB16pRlPksreirKCyUhwsNjVZ3bveY3S6mLVCDX4g7plFBnq+HDkJkcQBNEhsC2GlixZgrlz52LOnDkYPXo0XnjhBXi9Xixfvtyw/VVXXYXf//73uPfee+F225u5nSAIIlHG9uuBeTcOwW/uukK13CxNLllcVZAFAPjGVfkJ7yvW3EJVdT7dshSKDHUqSAoRBEG0H7YeH/r9fmzZsgULFiyILON5HsXFxVi/fn3SOuXz+eDzRS/wtbW1AIBAIIBAIGB7f8o2LdmWiELjmBy6wzhKkhh5nch5iqLxfuyO4Q9uGqJrzzExHicXfR1vn2yaXKy2f/3mRGw7dRlFg7IT/1tLIdN93D+5PxZ+uA+TBmZi84nLAAAHJ1k6ppVx7MqfU4IgCIKwJYaqq6sRCoWQm5urWp6bm4v9+/cnrVOLFy/Gk08+qVu+atUqeL3eFu+3tLQ0kW4RYWgck0NXHsfKSh5K4HnFihUt3s/Zs7H3k8gY1tcJUJ7J79++EcrPYbz++v3R7ayc26qD9vu2cCLwzjEe+y7L5762vByZqsC63FcHJyH9/C58fwyQl1KNzSfk5Xt27YDr7HbLx4s1jo2NjXa7T9iEsuQIgiDajw6ZWL5gwQKUlJRE3tfW1iI/Px8zZsxARkaG7f0FAgGUlpZi+vTpcDqdyexqt4LGMTl0h3H8x8VtwKUqAMCsWbNavJ/S+p3YeqFCt59kjOGfj36Bc031AIC5X5+FUM5R5GS4MWtiv5jb/ee2T4FQUNenZNOw5ij2fXIYADBz+jT0ZGqfHlu/CgCQ6nHitltnAgACIRE/2/wJAKBo8iTcNKJ33GNYGUclMk8QBEEQXRFbYqhXr14QBAGVlZWq5ZWVlUk1R3C73Yb1RU6nM6Gbx0S3J2RoHJNDVx5H1oQgkXPkeMYW22A/iYwhWzPkdDrx/eIRtvfRmn8/XojW/aS43YbH8rockeUORzR9L9XtstW3WOPYVT+jHQmOqoYIgiDaDVsGCi6XC4WFhSgrK4ssE0URZWVlKCoqSnrnCIIgWgu7ltcKPVLaXhw4TAwUUhjjB1bcse54BEEQBEGYYztNrqSkBA899BAmTZqEyZMn49lnn0VDQwPmzJkDAHjwwQfRr18/LF68GIBsurB3797I6zNnzmD79u1IS0vD0KFDk3gqBEF0NVrzeXlL6zT+8q1C/L+/78CPb7YfSbKDKEYjPaZiSOMaVzwqB2cuN2NCfmZrdo1IMlQzRBAE0X7YFkOzZ89GVVUVFi5ciIqKCkyYMAErV66MmCqcPHkSPJPacvbsWUycODHy/plnnsEzzzyD66+/HuXl5YmfAUEQRAtoaWRoTN8eWPmD65Lcm9g4eeNIT/+sFNX7ZQ9OAkDz1nQ26M9FEATRfrTIQGH+/PmYP3++4TqtwCkoKLA9YztBEJ2bYbnp+GSf8UTMHQW7k6G2NeyvpnYi2L98qxCvrT+BX95hPncS0XmgmiGCIIj2o0O6yREE0bn5/k1DERIlzByTPGOVZHPd8N7YcboG6e6O+TMoxniINHNMXoceW4IgCILoLHTMuwCCIDo1XpcDP501KuH9tGZMed6NQ9E3MwXXDY9vQd0eUEC9G0GBIYIgiHaDxBBBEN0Sj1PAfZMHtHc3CIIgCIJoR8h/lSAIogNCgaHuAwWGCIIg2g8SQwRBEB0QMp7pPpDxBUEQRPtBYoggCKIDQlqIIAiCIFofEkMEQXRYigb3bO8utBsSJcp1GyguRBAE0X6QgQJBEB2W2VflI9Ut4MoBWe3dlTbnliv6YOnqI8jPTonfmOiU5KdKONXA4euT+rd3VwiCILotJIYIguiwCDyHOyb0a+9utAtX9OuBNY/fgJx0T3t3hWglfnBFCOOKrsewvMz27gpBEES3hcQQQRBEB2Vgz9T27gLRijh4oID+xgRBEO0K1QwRBEEQBEEQBNEtITFEEARBEARBEES3hMQQQRAEQRAEQRDdEhJDBEEQBEEQBEF0S0gMEQRBEARBEATRLSExRBAEQRAEQRBEt4TEEEEQBEEQBEEQ3RISQwRBEARBEARBdEtIDBEEQRAEQRAE0S0hMUQQBEEQBEEQRLeExBBBEARBEARBEN0SEkMEQRAEQRAEQXRLSAwRBEEQBEEQBNEtITFEEARBEARBEES3xNHeHbCCJEkAgNra2hZtHwgE0NjYiNraWjidzmR2rVtB45gcaBwTh8YwOVgZR+V3V/kdJmToutQxoHFMDjSOyYHGMTm09bWpU4ihuro6AEB+fn4794QgCKJ7UldXhx49erR3NzoMdF0iCIJof5JxbeKkTvC4TxRFnD17Funp6eA4zvb2tbW1yM/Px6lTp5CRkdEKPewe0DgmBxrHxKExTA5WxlGSJNTV1aFv377gecqsVqDrUseAxjE50DgmBxrH5NDW16ZOERnieR79+/dPeD8ZGRn04UwCNI7JgcYxcWgMk0O8caSIkB66LnUsaByTA41jcqBxTA5tdW2ix3wEQRAEQRAEQXRLSAwRBEEQBEEQBNEt6RZiyO12Y9GiRXC73e3dlU4NjWNyoHFMHBrD5EDj2H7Q2CcHGsfkQOOYHGgck0Nbj2OnMFAgCIIgCIIgCIJINt0iMkQQBEEQBEEQBKGFxBBBEARBEARBEN0SEkMEQRAEQRAEQXRLSAwRBEEQBEEQBNEt6fJiaOnSpSgoKIDH48GUKVOwcePG9u5Su/LZZ5/h9ttvR9++fcFxHD744APVekmSsHDhQvTp0wcpKSkoLi7GoUOHVG0uXryIBx54ABkZGcjMzMTDDz+M+vp6VZudO3fi2muvhcfjQX5+Pp5++unWPrU2Y/HixbjqqquQnp6OnJwc3HnnnThw4ICqTXNzM+bNm4eePXsiLS0N99xzDyorK1VtTp48iVtvvRVerxc5OTl4/PHHEQwGVW3Ky8tx5ZVXwu12Y+jQoXjllVda+/TajOeffx7jxo2LTKpWVFSEjz76KLKexrBlPPXUU+A4Dj/4wQ8iy2gsOx50bYpC16XkQNem5EDXpuTT4a9LUhfmrbfeklwul7R8+XJpz5490ty5c6XMzEypsrKyvbvWbqxYsUL62c9+Jr333nsSAOn9999XrX/qqaekHj16SB988IG0Y8cO6atf/ao0aNAgqampKdLm5ptvlsaPHy99+eWX0tq1a6WhQ4dK9913X2R9TU2NlJubKz3wwAPS7t27pb/97W9SSkqK9Je//KWtTrNVmTlzpvTyyy9Lu3fvlrZv3y7NmjVLGjBggFRfXx9p873vfU/Kz8+XysrKpM2bN0tXX321dM0110TWB4NB6YorrpCKi4ulbdu2SStWrJB69eolLViwINLm6NGjktfrlUpKSqS9e/dKzz33nCQIgrRy5co2Pd/W4sMPP5T+9a9/SQcPHpQOHDgg/fSnP5WcTqe0e/duSZJoDFvCxo0bpYKCAmncuHHSY489FllOY9mxoGuTGrouJQe6NiUHujYll85wXerSYmjy5MnSvHnzIu9DoZDUt29fafHixe3Yq46D9qIjiqKUl5cn/f73v48su3z5suR2u6W//e1vkiRJ0t69eyUA0qZNmyJtPvroI4njOOnMmTOSJEnSn//8ZykrK0vy+XyRNk888YQ0YsSIVj6j9uH8+fMSAGnNmjWSJMlj5nQ6pXfeeSfSZt++fRIAaf369ZIkyRd/nuelioqKSJvnn39eysjIiIzbj3/8Y2nMmDGqY82ePVuaOXNma59Su5GVlSW9+OKLNIYtoK6uTho2bJhUWloqXX/99ZGLDo1lx4OuTebQdSl50LUpedC1qWV0lutSl02T8/v92LJlC4qLiyPLeJ5HcXEx1q9f344967gcO3YMFRUVqjHr0aMHpkyZEhmz9evXIzMzE5MmTYq0KS4uBs/z2LBhQ6TNddddB5fLFWkzc+ZMHDhwAJcuXWqjs2k7ampqAADZ2dkAgC1btiAQCKjGceTIkRgwYIBqHMeOHYvc3NxIm5kzZ6K2thZ79uyJtGH3obTpip/fUCiEt956Cw0NDSgqKqIxbAHz5s3DrbfeqjtfGsuOBV2b7EHXpZZD16bEoWtTYnSW65LDVutORHV1NUKhkGoQASA3Nxf79+9vp151bCoqKgDAcMyUdRUVFcjJyVGtdzgcyM7OVrUZNGiQbh/KuqysrFbpf3sgiiJ+8IMfYOrUqbjiiisAyOfocrmQmZmpaqsdR6NxVtbFalNbW4umpiakpKS0xim1Kbt27UJRURGam5uRlpaG999/H6NHj8b27dtpDG3w1ltvYevWrdi0aZNuHX0eOxZ0bbIHXZdaBl2bEoOuTYnTma5LXVYMEURbMG/ePOzevRvr1q1r7650SkaMGIHt27ejpqYG7777Lh566CGsWbOmvbvVqTh16hQee+wxlJaWwuPxtHd3CILoANC1KTHo2pQYne261GXT5Hr16gVBEHTOFJWVlcjLy2unXnVslHGJNWZ5eXk4f/68an0wGMTFixdVbYz2wR6jKzB//nz83//9H1avXo3+/ftHlufl5cHv9+Py5cuq9tpxjDdGZm0yMjK6xFMjAHC5XBg6dCgKCwuxePFijB8/Hv/93/9NY2iDLVu24Pz587jyyivhcDjgcDiwZs0a/PGPf4TD4UBubi6NZQeCrk32oOuSfejalDh0bUqMznZd6rJiyOVyobCwEGVlZZFloiiirKwMRUVF7dizjsugQYOQl5enGrPa2lps2LAhMmZFRUW4fPkytmzZEmnz6aefQhRFTJkyJdLms88+QyAQiLQpLS3FiBEjukQqgiRJmD9/Pt5//318+umnutSLwsJCOJ1O1TgeOHAAJ0+eVI3jrl27VBfw0tJSZGRkYPTo0ZE27D6UNl358yuKInw+H42hDaZNm4Zdu3Zh+/btkX+TJk3CAw88EHlNY9lxoGuTPei6ZB26NrUedG2yR6e7Ltn3hug8vPXWW5Lb7ZZeeeUVae/evdJ3v/tdKTMzU+VM0d2oq6uTtm3bJm3btk0CIC1ZskTatm2bdOLECUmSZAvTzMxM6R//+Ie0c+dO6Y477jC0MJ04caK0YcMGad26ddKwYcNUFqaXL1+WcnNzpW9961vS7t27pbfeekvyer1dxsL0kUcekXr06CGVl5dL586di/xrbGyMtPne974nDRgwQPr000+lzZs3S0VFRVJRUVFkvWIZOWPGDGn79u3SypUrpd69extaRj7++OPSvn37pKVLl3Yp682f/OQn0po1a6Rjx45JO3fulH7yk59IHMdJq1atkiSJxjARWNceSaKx7GjQtUkNXZeSA12bkgNdm1qHjnxd6tJiSJIk6bnnnpMGDBgguVwuafLkydKXX37Z3l1qV1avXi0B0P176KGHJEmSbUx//vOfS7m5uZLb7ZamTZsmHThwQLWPCxcuSPfdd5+UlpYmZWRkSHPmzJHq6upUbXbs2CF95Stfkdxut9SvXz/pqaeeaqtTbHWMxg+A9PLLL0faNDU1SY8++qiUlZUleb1e6a677pLOnTun2s/x48elW265RUpJSZF69eol/b//9/+kQCCgarN69WppwoQJksvlkgYPHqw6Rmfn3/7t36SBAwdKLpdL6t27tzRt2rTIxUaSaAwTQXvRobHseNC1KQpdl5IDXZuSA12bWoeOfF3iJEmS7MWSCIIgCIIgCIIgOj9dtmaIIAiCIAiCIAgiFiSGCIIgCIIgCILolpAYIgiCIAiCIAiiW0JiiCAIgiAIgiCIbgmJIYIgCIIgCIIguiUkhgiCIAiCIAiC6JaQGCIIgiAIgiAIoltCYoggCIIgCIIgiG4JiSGCSBLf/va3ceedd7Z3NwiCIAgCAF2XCMIKJIYIgiAIgiAIguiWkBgiCJu8++67GDt2LFJSUtCzZ08UFxfj8ccfx6uvvop//OMf4DgOHMehvLwcAHDq1Cl84xvfQGZmJrKzs3HHHXfg+PHjkf0pT+6efPJJ9O7dGxkZGfje974Hv9/fPidIEARBdCroukQQLcfR3h0giM7EuXPncN999+Hpp5/GXXfdhbq6OqxduxYPPvggTp48idraWrz88ssAgOzsbAQCAcycORNFRUVYu3YtHA4Hfv3rX+Pmm2/Gzp074XK5AABlZWXweDwoLy/H8ePHMWfOHPTs2RO/+c1v2vN0CYIgiA4OXZcIIjFIDBGEDc6dO4dgMIi7774bAwcOBACMHTsWAJCSkgKfz4e8vLxI+9dffx2iKOLFF18Ex3EAgJdffhmZmZkoLy/HjBkzAAAulwvLly+H1+vFmDFj8Mtf/hKPP/44fvWrX4HnKYBLEARBGEPXJYJIDPo0E4QNxo8fj2nTpmHs2LH4+te/jmXLluHSpUum7Xfs2IHDhw8jPT0daWlpSEtLQ3Z2Npqbm3HkyBHVfr1eb+R9UVER6uvrcerUqVY9H4IgCKJzQ9clgkgMigwRhA0EQUBpaSm++OILrFq1Cs899xx+9rOfYcOGDYbt6+vrUVhYiDfeeEO3rnfv3q3dXYIgCKKLQ9clgkgMEkMEYROO4zB16lRMnToVCxcuxMCBA/H+++/D5XIhFAqp2l555ZV4++23kZOTg4yMDNN97tixA01NTUhJSQEAfPnll0hLS0N+fn6rngtBEATR+aHrEkG0HEqTIwgbbNiwAb/97W+xefNmnDx5Eu+99x6qqqowatQoFBQUYOfOnThw4ACqq6sRCATwwAMPoFevXrjjjjuwdu1aHDt2DOXl5fiP//gPnD59OrJfv9+Phx9+GHv37sWKFSuwaNEizJ8/n/KyCYIgiJjQdYkgEoMiQwRhg4yMDHz22Wd49tlnUVtbi4EDB+K//uu/cMstt2DSpEkoLy/HpEmTUF9fj9WrV+OGG27AZ599hieeeAJ333036urq0K9fP0ybNk31RG7atGkYNmwYrrvuOvh8Ptx33334xS9+0X4nShAEQXQK6LpEEInBSZIktXcnCKI78+1vfxuXL1/GBx980N5dIQiCIAi6LhHdCop1EgRBEARBEATRLSExRBAEQRAEQRBEt4TS5AiCIAiCIAiC6JZQZIggCIIgCIIgiG4JiSGCIAiCIAiCILolJIYIgiAIgiAIguiWkBgiCIIgCIIgCKJbQmKIIAiCIAiCIIhuCYkhgiAIgiAIgiC6JSSGCIIgCIIgCILolpAYIgiCIAiCIAiiW0JiiCAIgiAIgiCIbsn/ByIMieTamGjWAAAAAElFTkSuQmCC"},"metadata":{}}]},{"cell_type":"markdown","source":"# 评估","metadata":{}},{"cell_type":"code","source":"# dataload for evaluating\n\n# load checkpoints\nmodel.load_state_dict(torch.load(\"checkpoints/imdb-lstm-subword/best.ckpt\", map_location=\"cpu\"))\n\nmodel.eval()\nloss, acc = evaluating(model, test_dl, loss_fct)\nprint(f\"loss:     {loss:.4f}\\naccuracy: {acc:.4f}\")","metadata":{"execution":{"iopub.status.busy":"2023-12-13T09:33:18.389522Z","iopub.execute_input":"2023-12-13T09:33:18.389809Z","iopub.status.idle":"2023-12-13T09:33:25.037192Z","shell.execute_reply.started":"2023-12-13T09:33:18.389784Z","shell.execute_reply":"2023-12-13T09:33:25.036224Z"},"trusted":true},"execution_count":23,"outputs":[{"name":"stdout","text":"loss:     0.3800\naccuracy: 0.8635\n","output_type":"stream"}]}]}